无法从node.js中的PHP中重现sha512 hmac

我有一些PHP代码生成一个hmac,如下所示:

<?php $secret = "7pgj8Dm6"; $message = "Test\0Message"; echo base64_encode(hash_hmac('sha512', $message, base64_decode($secret), true))."\n"; echo "69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO mQxlsWNPrw==\n"; ?> 

当我尝试在node.js中生成类似的代码时,我得到了一个不同于我想要的base64编码结果,而我不知道为什么。

 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('All is fine.'); }else{ console.log('Hash is wrong :('); } console.log('wanted:\t'+wanted); console.log('got:\t'+got); 

我对此的动机是我想玩一下的焦虑症。

好的,我明白了。 问题是我在hmac函数中创build的Buffer上调用了toString 。 当我删除,一切工作正常。

 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'); };