Ruby HMAC签名问题

我遇到了HMAC的问题。 我必须在将表格发送到银行之前签署一份表格。 它们仅在其文档中提供PHP中的示例。

我有一个hex密钥来签署我的数据(例如FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A )。

在PHP示例中,他们在签署数据之前使用密钥执行此操作:

  $key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A"; $message = "param1=a&param2=b"; $binKey = pack('H*', $key); $signature = hash_hmac('sha512', $msg, $binKey); echo $signature; // => a3efb70368bee502ea57a1a4708cac8912a5172075ea8dec2de2770dfbb4c8fb587f03fdadc0ca4f9e1bb024cfda12866295b259f5fb4df2fe14d960874a68ab 

我不明白为什么他们打包钥匙,如果我应该用我的钥匙做类似的事情。 我在Ruby代码中执行了以下操作:

 key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A" message = "param1=a&param2=b" digest = OpenSSL::Digest.new('sha512') signature = OpenSSL::HMAC.hexdigest(digest, key, message) puts signature # => d817611845246640d1224a0874bf60fed0956a367aa3069b7947cbec56903bb5d8c54df170f5504c586dad55e4f879c70cf1a40526cfc9f35411195822c535ed 

您需要在Ruby中执行此操作:

 hash = OpenSSL::HMAC.hexdigest(digest, [key].pack('H*'), message) 

这里真正的问题是您的PHP代码为消息使用两个变量名称。 你设置$message ,然后使用$msg ,这意味着你正在计算未定义变量的哈希值。

将密钥的hex表示forms打包成二进制forms是您缺少的。

请参阅此post,例如: https : //blog.bigbinary.com/2011/07/20/ruby-pack-unpack.html

你会想要这样的东西:

 signature = OpenSSL::HMAC.hexdigest(digest, key.pack('H'), message) 

我在我的项目中使用它:

 bin_key = Array(keyTest).pack 'H*' @hmac = OpenSSL::HMAC.hexdigest("SHA512", bin_key, msg).upcase 

这对我来说很好。