OpenSSL HMAC-SHA1摘要与Crypto不匹配

时间:2013-11-10 00:09:39

标签: php node.js digest hmacsha1

我花了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 个答案:

答案 0 :(得分:3)

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

这个会很好用:

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

答案 1 :(得分:0)

如果要在JS中复制PHP行为,请输入以下代码:

hmac = crypto.createHmac('sha1', 'thisisarandomkey')
signature = hmac.update('thisisanapple')
data = new Buffer(hmac.digest('hex')).toString('base64')