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,结果仍然相同(不同的密钥)。

4

2 回答 2

3

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

这个会很好用:

$payload = "thisisanapple";
$signature = hash_hmac("sha1", $payload, "thisisarandomkey", true);
$data = base64_encode($signature);
// wR7f2bJDVseOan5/AXgsbBLI6eE=
于 2013-11-10T00:38:36.987 回答
0

如果你想在 JS 中复制 PHP 的行为,这里是代码:

hmac = crypto.createHmac('sha1', 'thisisarandomkey')
signature = hmac.update('thisisanapple')
data = new Buffer(hmac.digest('hex')).toString('base64')
于 2013-12-02T01:02:17.247 回答