>我正在尝试在 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
必须用双引号引起来!