在 Ruby 中使用 HMAC SHA256

Posted

技术标签:

【中文标题】在 Ruby 中使用 HMAC SHA256【英文标题】:Using HMAC SHA256 in Ruby 【发布时间】:2016-01-18 12:41:03 【问题描述】:

我正在尝试应用 HMAC-SHA256 为 Rest API 生成密钥。

我正在做这样的事情:

def generateTransactionHash(stringToHash)
  key = '123'
  data = 'stringToHash'
  digest = OpenSSL::Digest.new('sha256')

  hmac = OpenSSL::HMAC.digest(digest, key, data)
  puts hmac
end

这个输出总是这样:(如果我把'12345'作为参数或'HUSYED815X',我得到的结果是一样的)

ۯw/o���p�T����:��a�h��E|q

因此 API 无法正常工作...有人可以帮我解决这个问题吗?

【问题讨论】:

根据文档digest: Returns the authentication code an instance represents as a binary string. 也许您应该改用hexdigest,它与digest 具有相同的签名,但返回十六进制编码的字符串(从文档看来它是相同的字符串但人类可读) 与 hexdigest 一起工作得很好!谢谢 既然我解决了你的问题,如果你让我回答而不是自己做就好了。 对不起@MichalSzyndel,已经删除了答案 【参考方案1】:

根据文档OpenSSL::HMAC.digest

将实例表示为二进制字符串的身份验证代码。

如果您在使用时遇到问题,可能需要OpenSSL::HMAC.hexdigest 提供的十六进制编码格式

例子

key = 'key'
data = 'The quick brown fox jumps over the lazy dog'
digest = OpenSSL::Digest.new('sha256')

OpenSSL::HMAC.digest(digest, key, data)
#=> "\xF7\xBC\x83\xF40S\x84$\xB12\x98\xE6\xAAo\xB1C\xEFMY\xA1IF\x17Y\x97G\x9D\xBC-\x1A<\xD8"

OpenSSL::HMAC.hexdigest(digest, key, data)
#=> "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"

【讨论】:

在这种情况下,要使其成为 HMAC SHA256,您需要将 digest = OpenSSL::Digest.new('sha256') 放在下方评论中:***.com/a/42832500/4706812 更新了答案@cmunozgar,不知道为什么我首先把sha1放在那里【参考方案2】:

试试这个:

hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, data)

【讨论】:

【参考方案3】:

在我的情况下(Ticketmatic),我必须像上面一样创建 HMAC,并向其中包含 HMAC 的请求添加一个 Authorization 标头。

hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret_key, access_key + name + time)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = "TM-HMAC-SHA256 key=#access_key ts=#time sign=#hmac"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true)  |http| http.request(req) 

您可以找到完整的要点here

还有一篇有更多解释的博文here

【讨论】:

以上是关于在 Ruby 中使用 HMAC SHA256的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 代码中使用 SHA256-HMAC?

如何在 python 代码中使用 SHA256-HMAC?

使用 HMAC-SHA256 的 Python 编码消息

在HMAC SHA256中编码字符串[关闭]

[Python中具有SHA256的base64 HMAC

对于 PBKDF2,使用 HMAC-SHA256 是不是比使用 HMAC-SHA-1 更安全?