PHP -- 计算正确的 HMAC 签名作为 nodejs 脚本


PHP -- calculating correct HMAC signature as nodejs script

所以我正在开发一个PHP脚本,该脚本查询使用HMAC身份验证标头的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代码的所有排列(有/没有base64编码消息,秘密;有/没有HMAC的二进制编码, 等)...无济于事。

对此有什么建议吗,一个筋疲力尽的猿猴?

问题是你没有先解码你的$hmac['secret'],然后再把它传递给hash_hmac()

尝试:

$hmac['secret'] = base64_decode($hmac['secret']);
$hmac['signature'] = base64_encode(
  hash_hmac('sha512', $hmac['message'], $hmac['secret'], true)
);