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

标签 c++ amazon-web-services

我在尝试使用 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=

我正在使用的服务:HMACSHA256Base64。我的签名:

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/

相关文章:

c++ - 在 googletest 或 cppunit 下移动参数化测试

c++ - Boost.Program_options : Forward parameters after '--' to another program

node.js - AWS Lambda 中的 PhantomJS(缺少 libfontconfig)

c++ - 如何调整 std::vector<std::queue<std::unique_ptr<int>>> 的大小?

java - 给构造函数命名有什么意义

python - 在 C++ 和 Python 中使用蒙特卡罗方法计算看涨期权价格时价格差异显着?

java - 如何使用 Java 代码从 AWS 获取 EC2 定价?

ruby-on-rails - AWS elasticsearch 服务抛出 Faraday::ConnectionFailed: 无法打开到 https:80 的 TCP 连接(getaddrinfo: 名称或服务未知)

python - AWS lambda s3文件解压缩python中的文件名问题

amazon-web-services - 提供的路由键格式不适合 HTTP 协议(protocol)