无法在node.js中从PHP复制sha512 hmac。

6 浏览
0 Comments

无法在node.js中从PHP复制sha512 hmac。

我有一些PHP代码,可以生成以下的HMAC:\n


\n当我尝试在node.js中生成类似的代码时,得到的base64编码的结果与我想要的不同,而且我无法弄清楚原因。\n

var hmac = function(msg, secret){
  var s = (new Buffer(secret, 'base64')).toString('utf8');
  var hmac = require('crypto').createHmac('sha512',s);
  hmac.update(msg);
  return hmac.digest('base64');
};
var secret = "7pgj8Dm6";
var message = "Test\0Message";
var wanted = "69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==";
var got = hmac(message, secret);
if(wanted === got){
  console.log('一切正常。');
}else{
  console.log('哈希值不正确 :(');
}
console.log('期望值:\t'+wanted);
console.log('实际值:\t'+got);

\n我这样做的动机是anxpro API,我想稍微尝试一下。

0
0 Comments

我找到了解决方法。问题出在我在函数中对对象调用了方法。当我去掉这部分代码后,一切都正常了。

var hmac = function(msg, secret){

var s = new Buffer(secret, 'base64');

var hmac = require('crypto').createHmac('sha512',s);

hmac.update(msg);

return hmac.digest('base64');

};

问题的原因是在函数中对对象调用了方法。这个方法会将对象转换成字符串。然而,在这种情况下,我们需要的是对象本身,而不是它的字符串表示。

解决方法很简单,只需要将对对象的方法的调用去掉即可。这样,对象就会被正确地传递给函数,并且我们能够正确地生成sha512 hmac。

希望这个解决方法能对遇到类似问题的人有所帮助。如果你有任何疑问,请随时提问。

0