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

时间:2019-06-27 10:58:30

标签: php ruby security encoding hmac

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

PHP示例:

select u.department as DM,
       count(u.userid) as num_users,
       count(l.userlogid) as num_log_users,
       count(case when o.status = 1 then l.userlogid end) as num_status1_users
from allusers u left join
     userlog l
     on l.userlogid = u.USERID
group by o.department;

Ruby代码:

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

这里的消息变量是JSON。

1 个答案:

答案 0 :(得分:2)

Ruby中的

OpenSSL::HMAC.hexdigest输出一个十六进制字符串,这就是base64编码的内容。在您的PHP代码中,true的{​​{1}}参数使其输出原始二进制数据。没有它,它将是十六进制,我认为这将与Ruby相同。

因此,您需要删除PHP代码中的hash_hmac参数,以便在PHP中编码十六进制表示形式,或者在Ruby中使用true,以便在Ruby中编码原始二进制数据

在PHP的密钥上也有OpenSSL::HMAC.digest,而在Ruby中没有trim(),但是我不认为这是问题所在。