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

PHP和Ruby上的相同代码给出了不同的结果,php,ruby,security,encoding,hmac,Php,Ruby,Security,Encoding,Hmac,我正在尝试使用PHP上编写的示例实现签名计算。但这些代码返回不同的结果 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

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

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
在Ruby中输出一个十六进制字符串,这就是base64编码。在PHP代码中,
true
参数to
hash\u hmac
使其输出原始二进制数据。如果没有这个,它将是十六进制的,我认为这将导致与Ruby的结果相同

因此,您需要删除PHP代码中的
true
param,以便在PHP中编码十六进制表示,或者在Ruby中使用
OpenSSL::HMAC.digest
,以便在Ruby中编码原始二进制数据


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

正如@Gabor Lengyel所说,您需要删除PHP中hash_hmac调用中的最后一个参数。此外,您可能需要从结束ruby输出中删除换行符,以便与PHPYes中的换行符进行比较,但我需要使用ruby代码返回与上面PHP相同的结果。我的意思是我需要修改Ruby代码,而不是PHP。哦,这很简单。将
OpenSSL::HMAC.hexdigest
替换为
OpenSSL::HMAC.digest
好的,我找到了将HMAC作为原始数据返回的方法。但结果仍然不如PHP)现在,我认为,问题在于编码…试图解决。。。