因此,我正在研究一个查询使用HMAC身份验证标头的API的PHP脚本。但是,我一直在努力尝试正确编码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)
);

关于php - PHP —计算正确的HMAC签名作为nodejs脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35840228/

10-13 06:28