PHP 和 Ruby 上的相同代码给出不同的结果

Same codes on PHP and Ruby give a different result

我正在尝试使用写在 PHP 上的示例实现签名计算。但是这些代码 return 不同的结果。

PHP 样本:

base64_encode(hash_hmac('sha384', $message, trim($key), true))

Ruby代码:

hmac_hash = OpenSSL::HMAC.hexdigest("SHA384", key, message)
signature = Base64.encode64(hmac_hash)

这里的消息变量是JSON。

OpenSSL::HMAC.hexdigest in Ruby 输出十六进制字符串,这就是您进行 base64 编码的内容。在您的 PHP 代码中,hash_hmactrue 参数使其输出原始二进制数据。没有它,它将是十六进制,我认为这将导致与 Ruby 相同的结果。

因此您需要删除 PHP 代码中的 true 参数,以便在 PHP 中编码十六进制表示,或者在 [=] 中使用 OpenSSL::HMAC.digest 27=],以便对 Ruby.

中的原始二进制数据进行编码

此外,PHP 中的键上有 trim(),但 Ruby 中没有 .strip,但我认为这不是问题所在。