2016-03-16 6 views
1

В настоящее время я пытаюсь реализовать часть аутентификации библиотеки, которую мы используем, но я наткнулся на странную проблему с подписями данных, вывод crypto.createHmac в NodeJS примерно в два раза меньше, чем у hash_hmac в PHP, и это единственная часть данных, которая отличается от PHP и NodeJS (и нам нужно использовать NodeJS здесь)NodeJS crypto.createHmac SHA256 не работает должным образом

Точный код, используемый для создания подписи в NodeJS есть

authorization["oauth_signature"] = crypto.createHmac('SHA256', process.env.SECRET).update(toSign).digest('base64'); 

И для PHP это

$authorization["oauth_signature"] = base64_encode(hash_hmac("SHA256", $signatureString . $signingKey, $secret)); 

Однако выход версии NodeJS является

7LkQP+qKR1gSdPq/AgH/3No3ps7EtZXnqwjivMixvM8= 

И для PHP это

NmQ0MWIzYmJiMjI2YzFlMDhiYzY3NzVmMWY0MzEwNDlhNDU3NDI0ZGJlMzU3NjJhYmMwYjgwYzZjMDE4NDM4OA== 

Который имеет более удвоит данные

Должен ли я использовать другую библиотеку для версии NodeJS, а не для сборки в одном? У нас есть наш NodeJS-сервер на Microsoft Azure, но не уверен, что это связано, но, по крайней мере, имеет смысл упомянуть.

Edit:

Я нашел этот вопрос, hash_hmac в PHP автоматически экспортирует свои данные как данные Hexidecimal, crypto.createHmac экспортирует свои данные в виде необработанных двоичных данных, которые я непосредственно преобразованы в base64, все, что мне нужно сделать сначала экспортировал данные в hex, а затем преобразовал их в base64.

ответ

3

Попробуйте это;

var crypto = require('crypto'); 
var s = 'The quick brown fox jumps over the lazy dog'; 
console.log(
    new Buffer(
     crypto.createHmac('SHA256', 'SECRET').update(s).digest('hex') 
    ).toString('base64') 
); 

DEMO

PHP эквивалент;

base64_encode(hash_hmac("SHA256",'The quick brown fox jumps over the lazy dog', 'SECRET')) 
+0

Спасибо, я только что нашел это, по-видимому hash_hmac экспорта это данные автоматически, как данные Hexidecimal но версия NodeJS делает это в двоичные данные, которые я непосредственно преобразуется в base64, шаг в промежутке между его конвертированием в гексагон, сделал трюк. – zezioen

0

В случае с Azure вы упомянули, что ключи поставляются в формате Base64. С библиотекой cryto для узла я нашел, что это сработало, когда я передал ключ в качестве буфера. Azure Authorization заголовок Подпись код узла Пример ниже:

const util = require('util'); 
const crypto = require('crypto'); 
var accountName = "YOUR_ACCOUNT_NAME"; 
var key = Buffer("YOUR_BASE64_KEY",'base64'); 
var hash = crypto.createHmac('sha256',key).update(stringToSign,'utf8').digest('base64'); 
var signature = util.format("%s:%s", accountName, hash); 
var authorization = util.format("SharedKey %s", signature);