gpt4 book ai didi

c - HMAC_SHA256 为 AWS 示例生成不正确的签名

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:40 24 4
gpt4 key购买 nike

我正在处理 here 中列出的示例

我正在使用 OpenSSL 提供的以下 HMAC_SHA256 代码来签署我传递给它的 URL。

#include <openssl/evp.h>
#include <openssl/hmac.h>

unsigned char* hmac_sha256(const void *key, int keylen,
const unsigned char *data, int datalen,
unsigned char *result, unsigned int* resultlen)
{
return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}

我设置示例的代码如下:

const unsigned char* test = "GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01";
unsigned char* result = hmac_sha256("1234567890",strlen("1234567890"),test,strlen((char*)test),NULL,NULL);
char dump[5] = {0};
sprintf(dump, "%02x", result[0]);
printf("%s",dump);

问题是当我应该为“j”得到 6a 时,我得到了 8F 作为输出。我收到有关变量 test 的符号性的警告,我认为这就是我没有得到正确输出的原因。我环顾四周,看看如何将 unsigned char* 初始化为等于示例中给出的 URL,但似乎您无法将文字设置为 unsigned char*。

我将如何正确取消字符串签名并将其正确传递给 hmac_sha256()?

最佳答案

您的代码有效。没有什么问题。先上代码,再解释。

ubuntu@ubuntu:~$ cat abc.c 
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <stdio.h>
#include <string.h>

unsigned char* hmac_sha256(const void *key, int keylen,
const unsigned char *data, int datalen,
unsigned char *result, unsigned int* resultlen)
{
return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}

int main()
{
const char* value = "GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01";
const char* key = "1234567890";

unsigned char* result = hmac_sha256(key,strlen(key),value,strlen(value),NULL,NULL);
printf("%s", result);
}


ubuntu@ubuntu:~$ echo -ne "GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01" | openssl dgst -sha256 -hmac "1234567890"
(stdin)= 8fb6d93342d767d797799aee4ea5a6d8322f0d8554537c313cfa69fa25f1cd07
ubuntu@ubuntu:~$ gcc abc.c -lcrypto -o abc
ubuntu@ubuntu:~$ ./abc | od -tx1
0000000 8f b6 d9 33 42 d7 67 d7 97 79 9a ee 4e a5 a6 d8
0000020 32 2f 0d 85 54 53 7c 31 3c fa 69 fa 25 f1 cd 07
0000040
ubuntu@ubuntu:~$ ./abc | base64
j7bZM0LXZ9eXeZruTqWm2DIvDYVUU3wxPPpp+iXxzQc=

您的程序生成“8f b6 d9 33 42 d7 67 d7 97 79 9a ee 4e a5 a6 d8 32 2f 0d 85 54 53 7c 31 3c fa 69 fa 25 f1 cd 07”你认为 8f 是错误的,因为它应该以 j 开头,如“j7bZM0LXZ9eXeZruTqWm2DIvDYVUU3wxPPpp+iXxzQc=”但是您还没有对输出进行 base64。

此处显示了使用 base64 程序将“8f b6 d9 33 42 d7 67 d7 97 79 9a ee 4e a5 a6 d8 32 2f 0d 85 54 53 7c 31 3c fa 69 fa 25 f1 cd 07”转换为 base64,但在你的情况,你会想以编程方式使用它。

这可以帮助您: How do I base64 encode (decode) in C?

长话短说:您没有做错任何事,您只是忘记了一个额外的步骤。

关于c - HMAC_SHA256 为 AWS 示例生成不正确的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43743828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com