OpenSSL HMAC-SHA1摘要与Crypto的不匹配

3

我花了过去6个小时来实现消息签名算法...但完全不起作用:

这是生成摘要的PHP代码:

$payload = "thisisanapple";
$signature = hash_hmac("sha1", $payload, "thisisarandomkey");
$data = base64_encode($signature);
// YzExZWRmZDliMjQzNTZjNzhlNmE3ZTdmMDE3ODJjNmMxMmM4ZTllMQ==

以下是在Node.js服务器上运行的JS代码,执行相同的操作:

var hmac = crypto.createHmac('sha1', "thisisarandomkey");
hmac.update("thisisanapple");
var signature = hmac.digest('base64');
// wR7f2bJDVseOan5/AXgsbBLI6eE=

我不知道这里出了什么问题... 我尝试了SHA256,但它们仍然不同。我还使用了OpenSSL生成的私钥,以明文和base64格式,结果仍然相同(密钥不同)。

2个回答

3

hash_hmac 有四个参数,最后一个参数指定输出,默认情况下 hash_hmac 返回十六进制字符串,而不是原始数据。因此,在 PHP 代码片段中使用 base64_encode 对十六进制字符串进行编码。

以下代码可以正常工作:

$payload = "thisisanapple";
$signature = hash_hmac("sha1", $payload, "thisisarandomkey", true);
$data = base64_encode($signature);
// wR7f2bJDVseOan5/AXgsbBLI6eE=

1
你知道如何编写JS代码以匹配原问题中的PHP行为吗? - karellm

0
如果你想在JS中复制PHP的行为,这里是代码:
hmac = crypto.createHmac('sha1', 'thisisarandomkey')
signature = hmac.update('thisisanapple')
data = new Buffer(hmac.digest('hex')).toString('base64')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接