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



>我正在尝试在 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 加密功能以获得相同的响应。

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

节点代码.js

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

然后我得到:

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE=

PHP 代码

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

有:

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE=

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

相关内容

最新更新