2016-03-07 2 views
1

Так что я работаю над PHP-скриптом, который запрашивает API, который использует заголовки аутентификации HMAC. Тем не менее, я ударился головой, пытаясь правильно закодировать подпись 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 + КС2 + yBfwhY/jWGUfz6dlKJUMkC2ktiPnuCcymdSWl4XezZT5VKCATYfus86Hz/Гг ==

Working из принципа, что «миллион обезьян, взломавших миллион клавиатур», однажды сможет кодировать действительную подпись HMAC, я даже проверил цикл, который выполняет итерации через все перестановки вышеуказанного PHP-кода (с/без base64, кодирующий меня ssage, секрет; с/без двоичного кодирования HMAC и т. д.) ... безрезультатно.

Любые предложения для этого здесь, один измученный обезьян?

ответ

1

Проблема в том, что вы не декодируете свой $hmac['secret'] прежде, чем передать его hash_hmac().

Try:

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

идеально - Джа благословить. – faustus

Смежные вопросы