Ruby HMAC 签名问题
Ruby HMAC signing issue
我遇到了 HMAC 问题。
我必须先在表格上签名,然后才能将其发送到银行。
他们仅在其文档中提供 PHP 中的示例。
我有一个十六进制密钥来签署我的数据(例如 FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A
)。
在 PHP 示例中,他们在签署数据之前使用密钥执行此操作:
$key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A";
$message = "param1=a¶m2=b";
$binKey = pack('H*', $key);
$signature = hash_hmac('sha512', $msg, $binKey);
echo $signature;
// => a3efb70368bee502ea57a1a4708cac8912a5172075ea8dec2de2770dfbb4c8fb587f03fdadc0ca4f9e1bb024cfda12866295b259f5fb4df2fe14d960874a68ab
我不明白他们为什么要打包密钥,以及我是否应该对我的密钥做类似的事情。
我在 Ruby 代码中执行了以下操作:
key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A"
message = "param1=a¶m2=b"
digest = OpenSSL::Digest.new('sha512')
signature = OpenSSL::HMAC.hexdigest(digest, key, message)
puts signature
# => d817611845246640d1224a0874bf60fed0956a367aa3069b7947cbec56903bb5d8c54df170f5504c586dad55e4f879c70cf1a40526cfc9f35411195822c535ed
将密钥的十六进制 表示 打包回二进制形式是您缺少的部分。
参见这个 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
这对我来说很好。
您需要在 Ruby 中执行此操作:
hash = OpenSSL::HMAC.hexdigest(digest, [key].pack('H*'), message)
这里真正的问题是您的 PHP 代码为消息使用了两个变量名称。您设置 $message
,然后使用 $msg
,这意味着您正在计算未定义变量的哈希值。
我遇到了 HMAC 问题。 我必须先在表格上签名,然后才能将其发送到银行。 他们仅在其文档中提供 PHP 中的示例。
我有一个十六进制密钥来签署我的数据(例如 FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A
)。
在 PHP 示例中,他们在签署数据之前使用密钥执行此操作:
$key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A";
$message = "param1=a¶m2=b";
$binKey = pack('H*', $key);
$signature = hash_hmac('sha512', $msg, $binKey);
echo $signature;
// => a3efb70368bee502ea57a1a4708cac8912a5172075ea8dec2de2770dfbb4c8fb587f03fdadc0ca4f9e1bb024cfda12866295b259f5fb4df2fe14d960874a68ab
我不明白他们为什么要打包密钥,以及我是否应该对我的密钥做类似的事情。 我在 Ruby 代码中执行了以下操作:
key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A"
message = "param1=a¶m2=b"
digest = OpenSSL::Digest.new('sha512')
signature = OpenSSL::HMAC.hexdigest(digest, key, message)
puts signature
# => d817611845246640d1224a0874bf60fed0956a367aa3069b7947cbec56903bb5d8c54df170f5504c586dad55e4f879c70cf1a40526cfc9f35411195822c535ed
将密钥的十六进制 表示 打包回二进制形式是您缺少的部分。
参见这个 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
这对我来说很好。
您需要在 Ruby 中执行此操作:
hash = OpenSSL::HMAC.hexdigest(digest, [key].pack('H*'), message)
这里真正的问题是您的 PHP 代码为消息使用了两个变量名称。您设置 $message
,然后使用 $msg
,这意味着您正在计算未定义变量的哈希值。