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

我试图用C ++执行对亚马逊产品广告API的请求。 实际上,我不确定这个问题是否存在于语言中,而不是我对文档的误读或误解。 让我提供来自文档的引用:

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

据我了解,我需要对请求字符串执行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示例中的摘要。 我的解决方案可以让任何未来的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

链接地址: http://www.djcxy.com/p/39011.html

上一篇: Amazon, Product Advertising API, signing request (C++)

下一篇: Amazon MWS