我在尝试使用 C++ 执行对亚马逊产品广告 API 的请求时遇到了困难。实际上,我不确定问题出在语言上,而不是出在我对文档的误读或误解上。让我提供文档中的引用:
Calculate an RFC 2104-compliant HMAC with the SHA256 hash algorithm using the string above with this example AWS secret key: 1234567890. For more information about this step, see documentation and code samples for your programming language.
据我所知,我需要对请求字符串执行 SHA256 哈希,使用 Base64 对其进行编码,然后另外对一些字符进行 URL 编码(例如“+”)。但是,当我尝试使用例如来自文档中的此字符串的 HMACSHA256 和 Base64 的一些在线服务来执行这些步骤时:
GET 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 示例中找到了对摘要的引用。这里有我为任何 future 的 Google 员工准备的解决方案 :)
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
一些附加说明:不要忘记将您的关联标记、版本、正确的时间戳和至少一个关键字标记放入请求中以执行实际搜索。这项服务在这方面真的很有帮助,试试看:Signer Helper
关于c++ - 亚马逊,产品广告 API,签名请求 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35919215/