10

我正在浏览亚马逊产品广告 API REST 签名文档,但我被困在了 #8

使用上面的字符串和我们的“虚拟”秘密访问密钥:1234567890,使用 SHA256 哈希算法计算符合 RFC 2104 的 HMAC。有关此步骤的更多信息,请参阅您的编程语言的文档和代码示例。

没关系,在Calculating a SHA hash with a string + secret key in python的帮助下,设法再试一次。将在下面发布答案。

4

3 回答 3

15

以下创建正确的签名:

require 'openssl'

secret_key = '1234567890'
query = 'AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06'
data = ['GET', 'ecs.amazonaws.com', '/onca/xml', query].join("\n")
sha256 = OpenSSL::Digest::SHA256.new
sig = OpenSSL::HMAC.digest(sha256, secret_key, data)
signature = Base64.encode64(sig)
于 2013-05-17T00:08:42.927 回答
2

添加到 AJcodez 答案:

我会做:

...
signature_raw = Base64.strict_encode64(sig)
signature     = CGI::escape(signature_raw)

encode64最后添加一个换行符,strict_encode64()没有。

https://stackoverflow.com/a/2621023/2760406

亚马逊希望您“对签名中的加号 (+) 和等号 (=) 字符进行 URL 编码”#9 - 如果您不这样做,现在将无法使用。

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html#rest_detailedexample

于 2014-12-11T22:51:47.047 回答
1

您可以使用 cryptoJs 使用您的秘密访问密钥计算密钥哈希消息身份验证代码 (HMAC-SHA256) 签名

首先通过键入在您的系统中本地安装cryptoJs

npm install crypto-js

要在全局范围内安装它,您可以将标志 -g 连接到上述命令。然后添加此代码并运行它。

var CryptoJS = require("crypto-js");

// Calculate an RFC 2104-compliant HMAC with the SHA256 hash algorithm

var exampleString = 
    "GET\n" +
    "webservices.amazon.com\n" +
    "/onca/xml\n" + 
    "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";

var signature = CryptoJS.HmacSHA256(exampleString, "1234567890");

console.log("test signature", signature.toString(CryptoJS.enc.Base64));
于 2018-07-06T12:13:15.097 回答