Я изо всех сил пытался создать правильную подпись 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, которая решает проблему различия между узлами и открывает SL. В этом выпуске они в основном говорят, что крипто в узле - это просто оболочка для библиотеки C++ openssl. И для того, чтобы он работал правильно, вам нужно предоставить секрет в виде буфера, а не строки из-за проблем с преобразованием.
E.g.
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