Ruby HMAC签名问题

Ruby HMAC签名问题,ruby,sign,hmac,Ruby,Sign,Hmac,我对HMAC有意见。 在寄到银行之前我必须在表格上签字。 他们在文档中只提供了一个PHP示例 我有一个十六进制键来签署我的数据(例如,FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE38A) 在PHP示例中,他们在对数据签名之前使用密钥执行此操作: $key = "FCEBA61A884A938E7E

我对HMAC有意见。 在寄到银行之前我必须在表格上签字。 他们在文档中只提供了一个PHP示例

我有一个十六进制键来签署我的数据(例如,FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE38A)

在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

将键的十六进制表示形式打包回二进制形式是您缺少的位

例如,请参阅此帖子:

你会想要这样的东西:

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

我在我的项目中使用这个:

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

这对我来说很好。

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

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

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

您可以提供一个PHP输入和输出的示例(不使用任何私有数据)以及相同Ruby的相应输出吗?@tadman我编辑了上面的代码,向您展示如何使用它。如您所见,签名不匹配。谢谢你好,达蒙,谢谢你的意见。未为String类定义pack方法(键为)。我试过使用
[key].pack('H')
[key].pack('H*')
但是十六进制输出仍然不同于我用PHP得到的输出。天哪,我很惭愧。。。非常感谢。别难过,我们都去过。我明白了这一点,因为我使用了另一种方法来计算实际的散列,发现Ruby是正确的(当使用上面提到的实际键时),然后研究PHP为什么是错误的。