NodeJS crypto.createHmac SHA512无法按预期工作

时间:2017-01-05 11:18:44

标签: php node.js azure

我正在尝试在API请求中实现身份验证,但我在签名数据时遇到了奇怪的问题。 NodeJS中crypto.createHmac的输出与PHP中的hash_hmac输出不同。我试图在PHP上实现这一点,NodeJs的响应是我的预期。

NodeJS代码

var crypto = require('crypto');
var hmac = crypto.createHmac('sha512', new Buffer(key, 'base64'));
var digest = hmac.update(salt + '\n' + returnUrl).digest();
var signature = digest.toString('base64');
console.log(signature);

PHP代码

$signature = base64_encode(hash_hmac("sha512",$salt.'\n'.$returnUrl, $key));
echo $signature;

对于我得到的NodeJS应用程序

VZ+gH+BVdZl6GIILfN5TFAxEIUqstiD5YwuQYTdk3R4LSxVzsAXPpPpn5MwHDoRllz5ll5iBpAOuO2DQ9nvtGA==

这是预期的反应,但PHP给了我不同的结果

NzNlNmFhNWUwOTg2OGQ3NzdhNjU0MWZmOTZhZDZjYmFiYjE4ZjMxZTc5OTk3MDI5ZGI1M2M3YmU3MjRiYTdiNjJmODM4NDA1NmMzNWZlOWE2NTVkZjhmZTg4MDg0MjA3ZmYzMjg1MGQxYzFiZDNkODA2M2MzZGVhOTRiZWMzNTA=

与预期完全不同。有没有办法可以在PHP中重新创建NodeJS加密功能,获得相同的响应。

1 个答案:

答案 0 :(得分:0)

在下面的示例中,我使用node.js和PHP来获取签名数据,并且它们都获得相同的输出。您可以将其作为参考。

Node.js的代码

var crypto = require('crypto');
var hmac = crypto.createHmac('sha512', 'sharedpassword');
var digest = hmac.update('12345\nhttps://google.com').digest('hex');
var signature = new Buffer(digest).toString('base64');
console.log(signature);

然后我得到:

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE=

PHP代码

$signature = base64_encode(hash_hmac('sha512', "12345\nhttps://google.com", 'sharedpassword'));
echo $signature;

GOT:

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE=

另请注意,PHP仅在使用双引号(")时解释转义字符。所以\n必须是双引号!