【问题标题】:OpenSSL HMAC-SHA1 digest does not match Crypto'sOpenSSL HMAC-SHA1 摘要与 Crypto 的不匹配
【发布时间】:2013-12-02 09:02:17
【问题描述】:

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

【问题讨论】:

    标签: php node.js digest hmacsha1


    【解决方案1】:

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

    这个会很好用:

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

    【讨论】:

    • 你知道与原始问题中的 PHP 行为相匹配的 JS 代码是什么吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2011-10-26
      • 1970-01-01
      • 2018-02-28
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多