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_hmac
的 true
参数使其输出原始二进制数据。没有它,它将是十六进制,我认为这将导致与 Ruby 相同的结果。
因此您需要删除 PHP 代码中的 true
参数,以便在 PHP 中编码十六进制表示,或者在 [=] 中使用 OpenSSL::HMAC.digest
27=],以便对 Ruby.
中的原始二进制数据进行编码
此外,PHP 中的键上有 trim()
,但 Ruby 中没有 .strip
,但我认为这不是问题所在。
我正在尝试使用写在 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_hmac
的 true
参数使其输出原始二进制数据。没有它,它将是十六进制,我认为这将导致与 Ruby 相同的结果。
因此您需要删除 PHP 代码中的 true
参数,以便在 PHP 中编码十六进制表示,或者在 [=] 中使用 OpenSSL::HMAC.digest
27=],以便对 Ruby.
此外,PHP 中的键上有 trim()
,但 Ruby 中没有 .strip
,但我认为这不是问题所在。