我正在尝试在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加密功能,获得相同的响应。
答案 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
必须是双引号!