NodeJS从php返回HMAC的其他二进制结果

时间:2015-03-03 19:14:43

标签: php node.js hmac

我在windows上运行node.js和php,我在node.js中使用了包含的加密模块。

Php脚本:

hash_hmac("sha256", "foo", "bar", true) // the true enables binary output

输出:

  

¶y3!è¬╝♂ï►ó│Ñ├Fä╚┘CA╝±G6▄rp¸t↑Q

Node.js脚本:

crypto.createHmac("sha256", "bar").update("foo").digest("binary");

输出:

  

¶y3!?ª¼♂?►¢¥³AF?ÈÙCA¼ñG6Ürp÷吨↑Q

我也想知道为什么有些数字是相同的,有些则不是。


我也试过获取十六进制而不是二进制结果,两者都输出相同的

hash_hmac("sha256", "foo", "bar", false); // false outputs hex data
crypto.createHmac("sha256", "bar").update("foo").digest("hex"); // notice "hex"

这不是解决方案,因为我无法将十六进制数据转换为二进制数据:

var hmac = crypto.createHmac("sha256", "bar").update("foo").digest("hex");
var binary = new Buffer(hmac, "hex");

变量binary输出:

  

¶y3!???♂?►???? F ??? CA ?? G6?RP?吨↑Q

2 个答案:

答案 0 :(得分:2)

在为OTP simplepay实现节点js解决方案时遇到了同样的问题。

PHP代码:

base64_encode(hash_hmac('SHA384', $text, trim($key), true));

JS代码:

function get_hash(key, text) {
    const crypto = require("crypto");
    const algorithm = "sha384";

    var hmac = crypto.createHmac(algorithm, key).update(text);
    return hmac.digest().toString('base64');
}

因此,两个都注销/回显-得到相同的结果。 在您的情况下,二进制输出将是:

crypto.createHmac("sha256", "bar").update("foo").digest().toString('binary');

但是,请记住,由于字符编码的原因,记录和回显二进制字符串将给出稍微不同的视图。您可以看到相同但不同的字符。

PHP回声

,cAW'B�o��傱�@�Vlάf�R@y�,?0�^ 1 =Y�����u2

NODE console.log

,cAW'BÛåoº°å±¹@VlÎfÞ꧸§u2

实际上是相同的,只是外观不同。 参见this github issue and addaleax's comment

答案 1 :(得分:0)

calculateHmac(payload) {
    const hmac = crypto.createHmac('sha256', KEY);
    hmac.update(Buffer.from(payload).toString());
    let bin = hmac.digest();
    return Buffer.from(bin).toString('base64');
}