2016-03-07 92 views
1

因此,我正在研究一個PHP腳本,該腳本查詢使用HMAC身份驗證標頭的API。但是,我一直在試圖正確編碼HMAC簽名。我有一個預先存在的nodejs腳本作爲模板工作。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 /千兆克==

工作從原理上說,「百萬只猴子在一百萬鍵盤劈砍而去」也許有一天能夠編碼有效的HMAC簽名,我甚至測試一個循環,通過上面的PHP代碼(有/的所有排列不迭代base64編碼我祕密有/無HMAC的二進制編碼等)......無濟於事。

這這裏的任何建議,一個疲憊的猿猴?

回答

1

的問題是,你不把它傳遞給hash_hmac()之前解碼的$hmac['secret']第一。

嘗試:

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

完美 - 扎哈祝福。 – faustus