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

所以我正在处理一个PHP脚本,查询使用HMAC身份validation标头的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签名,我甚至testing了一个遍历上述PHP代码的所有排列的循环(带/不带base64编码消息,秘密;有/没有二进制编码的HMAC等)… …无济于事。

这里的任何build议,一个用尽的猿?

问题在于,在将它传递给hash_hmac()之前,您没有先解码$hmac['secret']

尝试:

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