PHP -- 计算正确的 HMAC 签名作为 nodejs 脚本
PHP -- calculating correct HMAC signature as nodejs script
所以我正在编写一个 PHP 脚本,该脚本查询一个使用 HMAC 身份验证 headers 的 API。但是,我一直在努力尝试正确编码 HMAC 签名。我有一个预先存在的 nodejs 脚本可以用作模板。
在nodejs脚本中,HMAC签名的计算方式如下:
var crypto = require('crypto');
var hmac = [];
hmac.secret = 'ODc0YTM3YzUxODFlMWQ1YTdhMGQwY2NiZmE1N2Y1ODdjYzM5NTgyMDJhZjVkYTE4MmQxYzQ5ODk0M2QzNWQxYw==';
hmac.timestamp = 1457326475000;
hmac.path = '/account/';
hmac.message = hmac.path +'\n' + hmac.timestamp;
var sig = crypto.createHmac('sha512', new Buffer(hmac.secret, 'base64'));
hmac.signature = sig.update(hmac.message).digest('base64');
console.log(hmac);
此正确 将 HMAC 签名计算为:
bWjIFFtFmWnj0+xHLW2uWVa6M6DpbIV81uyUWwRFCJUg+0Xyt40QWZWQjGvfPUB/JbjGZHUoso0Qv5JHMYEv3A==.
同时,在 PHP,我正在使用:
<?php
$hmac['secret'] = 'ODc0YTM3YzUxODFlMWQ1YTdhMGQwY2NiZmE1N2Y1ODdjYzM5NTgyMDJhZjVkYTE4MmQxYzQ5ODk0M2QzNWQxYw==';
$hmac['nonce'] = '1457326475000';
$hmac['path'] = '/account/';
$hmac['message'] = $hmac['path']."\n".$hmac['nonce'] ;
$hmac['signature'] = base64_encode(hash_hmac('sha512',$hmac['message'],
$hmac['secret'], true));
print_r($hmac);
以上代码,计算HMAC签名为:
vqP49m/bk9nA4S3nMqW2r+kc2+yBfwhY/jWGUfz6dlKJUMkC2ktiPnuCcymdSWl4XezZT5VKCATYfus86Hz/Gg==
根据“一百万只猴子攻击一百万个键盘”的原则,也许有一天能够编码一个有效的 HMAC 签名,我什至测试了一个循环遍历上述 PHP 代码的所有排列(with/without base64 编码消息,秘密;with/without HMAC 的二进制编码等)...无济于事。
对此有什么建议吗,一只疲惫的猿猴?
问题是您在将 $hmac['secret']
传递给 hash_hmac()
之前没有先对其进行解码。
尝试:
$hmac['secret'] = base64_decode($hmac['secret']);
$hmac['signature'] = base64_encode(
hash_hmac('sha512', $hmac['message'], $hmac['secret'], true)
);
所以我正在编写一个 PHP 脚本,该脚本查询一个使用 HMAC 身份验证 headers 的 API。但是,我一直在努力尝试正确编码 HMAC 签名。我有一个预先存在的 nodejs 脚本可以用作模板。
在nodejs脚本中,HMAC签名的计算方式如下:
var crypto = require('crypto');
var hmac = [];
hmac.secret = 'ODc0YTM3YzUxODFlMWQ1YTdhMGQwY2NiZmE1N2Y1ODdjYzM5NTgyMDJhZjVkYTE4MmQxYzQ5ODk0M2QzNWQxYw==';
hmac.timestamp = 1457326475000;
hmac.path = '/account/';
hmac.message = hmac.path +'\n' + hmac.timestamp;
var sig = crypto.createHmac('sha512', new Buffer(hmac.secret, 'base64'));
hmac.signature = sig.update(hmac.message).digest('base64');
console.log(hmac);
此正确 将 HMAC 签名计算为: bWjIFFtFmWnj0+xHLW2uWVa6M6DpbIV81uyUWwRFCJUg+0Xyt40QWZWQjGvfPUB/JbjGZHUoso0Qv5JHMYEv3A==.
同时,在 PHP,我正在使用:
<?php
$hmac['secret'] = 'ODc0YTM3YzUxODFlMWQ1YTdhMGQwY2NiZmE1N2Y1ODdjYzM5NTgyMDJhZjVkYTE4MmQxYzQ5ODk0M2QzNWQxYw==';
$hmac['nonce'] = '1457326475000';
$hmac['path'] = '/account/';
$hmac['message'] = $hmac['path']."\n".$hmac['nonce'] ;
$hmac['signature'] = base64_encode(hash_hmac('sha512',$hmac['message'],
$hmac['secret'], true));
print_r($hmac);
以上代码,计算HMAC签名为: vqP49m/bk9nA4S3nMqW2r+kc2+yBfwhY/jWGUfz6dlKJUMkC2ktiPnuCcymdSWl4XezZT5VKCATYfus86Hz/Gg==
根据“一百万只猴子攻击一百万个键盘”的原则,也许有一天能够编码一个有效的 HMAC 签名,我什至测试了一个循环遍历上述 PHP 代码的所有排列(with/without base64 编码消息,秘密;with/without HMAC 的二进制编码等)...无济于事。
对此有什么建议吗,一只疲惫的猿猴?
问题是您在将 $hmac['secret']
传递给 hash_hmac()
之前没有先对其进行解码。
尝试:
$hmac['secret'] = base64_decode($hmac['secret']);
$hmac['signature'] = base64_encode(
hash_hmac('sha512', $hmac['message'], $hmac['secret'], true)
);