无法使用HMAC SHA256从示例中重现AWS签名

我正在关注这个例子

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

并试图重现64个字符串的签名,他们声称…

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

我已成功匹配Canonical Request的hex digeset,并确认StringToSign字符串是正确的。

最后一部分是计算signing_key和签名。 这是我使用提供的ruby函数’getSignatureKey’击中路障的地方

http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-ruby

 signing_key = getSignatureKey secret_access_key, current_date, region, aws_service signature = OpenSSL::HMAC.digest('sha256', signing_key, string_to_sign) def getSignatureKey key, dateStamp, regionName, serviceName kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") kSigning end 

‘signature’的当前输出是这个奇怪的字符序列。

ٻ . h5 3 e }wQ

为了让签名平等,我错过了什么?

 aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

我无法从你的post中看出,但这些结果可能完全相同,格式不同。

您的代码返回HMAC操作的原始结果 – 这是任意二进制数据,因此它不会打印为任何可读的。 亚马逊希望你为每个字节提供hex表示:你的前几个字节是“\ xae \ xee”而不是“aeee”

最简单的方法是调用hexdigest而不是digest 。 请注意,您应该只对最终的HMAC执行此操作(当您使用签名密钥对字符串进行签名时),而不是在构造签名密钥时

您的“奇怪的字符序列”实际上可能是正确的输出。

OpenSSL::HMAC.digest吐出以二进制表示的值,并将其与以hex表示的值进行比较

检查在将签名转换为hex表示后打印出签名时会发生什么,如下所示:

 signature.each_byte.map { |b| "%02x" % b }.join