Nodejs отличается подписью HMAC от OpenSSL - PullRequest
0 голосов
/ 01 июня 2019

Я изо всех сил пытался создать правильную подпись HMAC в Node.

Вариант использования

В настоящее время я работаю с клиентом Jointspace API для Node для управления интеллектуальными телевизорами Philips.Но чтобы это работало, мне нужно подписать строку для запроса на сопряжение.

Текущая ситуация

Мой код nodejs выглядит следующим образом:

const crypto = require('crypto');

let secret = Buffer.from('ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==', 'base64');
let text = '12345';
let algorithm = 'sha1';
let hmac = crypto.createHmac(algorithm, secret);
hmac.write(text);
hmac.end();

console.log(hmac.read('binary').toString('base64'));

Когда я его запускаю, это приводит к следующему:

~ $ node test.js
DURLMkx7YdrIlWdUKo3iNDC3cp0=

Ожидается

Когда я делаю то же самое с командой openssl через командную строку, я получаю другой результат.(Правильный результат)

~ $ echo -n "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==" | base64 -d | openssl dgst -sha1 -hmac "12345" -binary | base64
GvbRLlBSY8r/jPqUGox8zZHxOew=

Ссылки

Существует проблема на странице Github узла , которая решает проблему различия между Node и openssl.В этом выпуске они в основном говорят, что crypto in node - это просто оболочка для библиотеки C ++ openssl.И для того, чтобы он работал правильно, вы должны предоставить секрет в виде буфера вместо строки из-за проблем с конвертацией.

Например,

crypto.createHmac('sha1', new Buffer('secret_key', 'utf8'));

Но это не решает мою проблему.

Различия в выводе

~ $ echo "DURLMkx7YdrIlWdUKo3iNDC3cp0=" | base64 -d | hexdump -C
00000000  0d 44 4b 32 4c 7b 61 da  c8 95 67 54 2a 8d e2 34  |.DK2L{a...gT*..4|
00000010  30 b7 72 9d                                       |0.r.|
00000014
~ $ echo "GvbRLlBSY8r/jPqUGox8zZHxOew=" | base64 -d | hexdump -C
00000000  1a f6 d1 2e 50 52 63 ca  ff 8c fa 94 1a 8c 7c cd  |....PRc.......|.|
00000010  91 f1 39 ec                                       |..9.|
00000014

1 Ответ

1 голос
/ 01 июня 2019

В вашей команде вы используете 12345 в качестве ключа HMAC, но в своем коде вы используете его в качестве данных!так вот обновление по коду

const crypto = require('crypto');

let secret = 'ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA=='
let key = '12345';
let algorithm = 'sha1';
let hmac = crypto.createHmac(algorithm, key);
hmac.write(secret);
hmac.end();

console.log(hmac.read('binary').toString('base64'));

А вот команда

echo -n "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==" | openssl dgst -sha1 -hmac "12345" -binary | base64

Они оба возвращают один и тот же хеш.

...