【发布时间】:2019-10-09 13:55:26
【问题描述】:
在尝试生成 HMAC+SHA256 签名时,对于某些有效负载,我从 openssl 命令行得到的结果与 openssl lib 不同。
这是为了尝试为 AWS 生成 v4 签名。 我可以用 bash/curl 成功地做到这一点。 代码显示了每一步的每个签名,除了服务(s3)的签名之外,所有匹配的签名都与通过openssl命令行生成的不同
int i;
char data[1024] = "";
char hashString[SHA256_DIGEST_LENGTH*2];
unsigned char *bytearray=malloc(SHA256_DIGEST_LENGTH);
unsigned char *digest=malloc(SHA256_DIGEST_LENGTH);
printf("echo -n us-east-1|openssl dgst -sha256 -mac HMAC -macopt hexkey:b098ff9a24e0573d9e0f952963d0725c4e9c7566ebb3713bf8e0707d43146822\n");
strcpy(hashString,"b098ff9a24e0573d9e0f952963d0725c4e9c7566ebb3713bf8e0707d43146822\0");
strcpy(data, "us-east-1");
//This works
for (i = 0; i < strlen(hashString)/2 ; i++)
sscanf(hashString + 2*i, "%02x", (unsigned int *) &bytearray[i]);
digest = HMAC(EVP_sha256(), bytearray, strlen((const char *)bytearray), (unsigned char*)data, strlen(data), NULL, NULL);
printf(" should be: e811cc78009ad7918504aca1ff987199285352a6fabd1063d6d1a938ac673dbf\n");
printf("HMAC digest: ");
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
printf("%02x",(unsigned int)digest[i]);
printf("\n");
//This doesn't
printf("echo -n s3|openssl dgst -sha256 -mac HMAC -macopt hexkey:e811cc78009ad7918504aca1ff987199285352a6fabd1063d6d1a938ac673dbf\n");
strcpy(hashString,"e811cc78009ad7918504aca1ff987199285352a6fabd1063d6d1a938ac673dbf");
strcpy(data, "s3");
for (i = 0; i < strlen(hashString)/2 ; i++)
sscanf(hashString + 2*i, "%02x", (unsigned int *) &bytearray[i]);
digest = HMAC(EVP_sha256(), bytearray, strlen((const char *)bytearray), (unsigned char*)data, strlen(data), NULL, NULL);
printf(" should be: f405cc5d87cd57f8130decb58108ac0ae5a0bccb97e40729f9ace287d4ee054d\n");
printf("HMAC digest: ");
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
printf("%02x",(unsigned int)digest[i]);
printf("\n");
【问题讨论】:
-
您在
bytearray上调用strlen(),它不是以 0 结尾的字符串,因此未定义的行为会导致不可预知的结果。 -
您还对
sscanf()撒谎并告诉它您从bytearray传递的地址是整数而不是字符。我很惊讶它没有立即崩溃,但这对你来说是未定义的行为。 -
digest = HMAC(...)导致内存泄漏,因为digest以前指向一些分配的内存。