无法使用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