当前位置: 首页 > 知识库问答 >
问题:

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

傅志用
2023-03-14

我在效仿这个例子

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

并试图为他们声明为。。。

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

我已经成功匹配了规范请求的十六进制数字集,并肯定StringToSign字符串是正确的。

最后一部分是计算签名密钥和签名。这就是我使用提供的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

“签名”的当前输出是这个奇怪的字符序列。

��ٻ���.�����h5��3.��E�}wQ��

我错过了什么让签名等于。。。

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

共有2个答案

岑驰
2023-03-14

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

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

检查一下,当您将签名转换为十六进制表示后,打印出签名时会发生什么:

signature.each_byte.map { |b| "%02x" % b }.join
萧渝
2023-03-14

我无法从你的帖子中判断,但这些结果很可能完全相同,格式不同。

您的代码返回HMAC操作的原始结果-这是任意二进制数据,因此不会以任何可读的形式打印。Amazon希望您为每个字节提供十六进制表示:前两个字节是“\xae\xee”,而不是“aeee”

最简单的方法是调用hexdigest而不是digest。请注意,您应该只对最终的HMAC(当您用签名键签名字符串时)这样做,而不是在构造签名键时

 类似资料:
  • 我是dynamodb的新手,尝试从dynamodb获取数据。 这是我的表,以“主题”为主要散列键 我的python代码 我得到以下错误 botocore.exceptions.ClientError:调用GetItem操作时发生错误(ValidationException):提供的键元素与架构不匹配 我的代码中有什么遗漏吗?

  • 本文向大家介绍thinkPHP中volist标签用法示例,包括了thinkPHP中volist标签用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP中volist标签用法。分享给大家供大家参考,具体如下: 属性: name(必须) 要输出的数据模板变量 id(必须) 循环变量 offset(可选) 要输出数据的offset length(可选) 输出数据的长度 key

  • 对于支付提供商,我需要使用HMAC-SHA256计算基于哈希的消息身份验证码。这给我带来了不少麻烦。 支付提供商给出了两个在伪码中正确计算身份验证码的示例。所有键均为十六进制。 在做了一些研究之后,我试图编写代码来实现这一点,但我不断得出不同的结果。 这是我得到的结果: 因此,使用这两种方法中的任何一种,我都可以得到提供者示例想要的结果。 我错过了什么?它是编码吗?我的hexDecode坏了吗?

  • 我无法ping与之关联公共IP的EC2实例。在发布之前,我阅读了Cannot-ping AWS EC2实例。这没有帮助: 以下是我如何设置的: 我使用所有默认值创建了一个新的AmazonLinuxt2.micro实例。 创建后,它在 EC2 |实例|实例。 所以我去了EC2|NETWORK 我返回EC2|INSTANCES|INSTANCES,IPv4 Public IP列显示了我刚刚创建的地址。

  • 我正试图生成一个预先签名的URL,其中包含文档中可用的确切代码: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-s3-presign.html 但我有一个错误: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 知道文档代码为什么不起作用吗?这似乎与AWS签名V4有关。我不知道