亚马逊,产品广告 API,签名请求 (C++)

Amazon, Product Advertising API, signing request (C++)

本文关键字:请求 C++ API 亚马逊      更新时间:2023-10-16

我陷入了尝试使用 C++ 执行对亚马逊产品广告 API 的请求。实际上,我不确定问题出在语言上,而不是我对文档的误读或误解。让我引用文档:

使用上面的字符串和以下示例 AWS 私有密钥:1234567890,使用 SHA256 哈希算法计算符合 RFC 2104 的 HMAC。有关此步骤的详细信息,请参阅编程语言的文档和代码示例。

据我了解,我需要对请求字符串执行 SHA256 哈希,使用 Base64 对其进行编码,然后另外对一些字符进行 URL 编码(例如"+")。但是,当我尝试执行这些步骤时,例如一些用于 HMACSHA256 的在线服务和文档中此字符串的 Base64:

获取 webservices.amazon.com /onca/xml AWSAccessKeyId=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

我得到了完全不同的签名(与文档中提供的签名不同)。来自文档的签名:

j7bZM0LXZ9eXeZruTqWm2DIvDYVUU3wxPPpp+iXxzQc=

我正在使用的服务:HMACSHA256 和 Base64。我的签名:

YzZhNzMwZGIwMDhmMmY4NjhiOTYyNTNiNjhmMGE5YjY2MWNlOGRhYzMxOTczZDM5Yjk4YzM5MmE4MTNmNmZkOQ==

我也尝试在我的C++代码中执行相同的步骤,但得到不同的签名。基本上,我的问题是:我到底做错了什么?我是否误解了算法的步骤,或者有一些我不知道的其他步骤或其他内容?
如果有人已经在C++中做了类似的事情,并且可以提供一些代码片段,我将不胜感激。对我的错误的任何一点也将受到高度赞赏。如果您错过了我这边的一些信息 - 请在评论中指出,我会尽快提供。

我终于设法得到了解决方案。我不会说问题在于我对文档的误读或误解,而是普遍缺乏对散列/签名的知识。基本上,问题是我没有对HMACSHA256进行摘要。在深入研究了另一种语言的示例之后,我发现此引用在 Python 示例中进行了摘要。这里有我为任何未来的谷歌员工提供的解决方案:)

std::string generate_hmac256bit_hash(const char *message, const char *key_buf) {
   unsigned char* digest = HMAC(EVP_sha256(), key_buf, strlen(key_buf), (unsigned char*)message, strlen(message), NULL, NULL);
   std::string signature = base64_encode(digest, strlen((char *)digest));
   return signature;
}

如您所见,它很短。我使用OpenSSL库进行哈希处理和一些第三方base64编码方法。显然,您可以使用任何其他解决方案,但是我建议您在 Python 中使用此代码片段测试您的代码结果:

import hmac
import hashlib
import base64
message = b'put your request here'
dig = hmac.new(b'put your secret key here', msg=message, digestmod=hashlib.sha256).digest()
print base64.b64encode(dig).decode()      # py3k-mode

一些额外的注意事项:不要忘记将您的关联标签、版本、正确的时间戳和至少一个关键字标签放入请求中以执行实际搜索。此服务在这方面非常有帮助,请尝试一下: 签名者助手