createHmac дает два разных вывода из буфера - PullRequest
0 голосов
/ 29 октября 2019

рассмотрим этот буфер, декодированный base64

const base64decoded = Buffer.from('key', 'base64')

Теперь два дайджеста ниже будут другими:

crypto.createHmac('sha512', base64decoded)
    .update('test')
    .digest('base64')
// -> QkooamNoTPVTrhrrxkU5r2vnFU3e7DMSJaukjAEugOiBYFnQyxHQDZvy6zMYesNHHyoG78cgW27K2m9+OPuQ6g==
crypto.createHmac('sha512', base64decoded.toString())
    .update('test')
    .digest('base64')
// -> zLSdI2dO7o84v41Z5vbxUUyu6FQSTzWOS3OHf7/iijHZUecDKyFeDGzB3Ei22cO9Zcr8a9AiiRiDiBVb0e+kmw==

Это действительно смущает меня, я ожидал того же результата. Как Buffer используется в createHmac для выдачи другого выхода?


И как мне изменить мою вторую функцию, чтобы она давала такой же вывод, как и первая? Я пытаюсь сделать порт браузера для пакета узла, который использует createHmac, все работало хорошо, но window.crypto.subtle.sign (HMAC) также дает другой вывод, потому что я не могу понять, как использовать буфер.

1 Ответ

2 голосов
/ 29 октября 2019

Если кодировка не указана, Buffer.toString() преобразует содержимое буфера в строку с кодировкой utf8. crypto.createHmac использует Buffer.from() для ключа, если это строковый тип. Эта функция также использует кодировку utf8 по умолчанию. Так что это должно сработать.

Однако, как вы уже видели, есть предостережение: вывод Buffer.from('key', 'base64') не является действительными данными utf8. Таким образом, преобразование в utf8 приводит к потере данных. К сожалению, это не выдает ошибку .

Лучшим решением будет придерживаться Buffer, который является лучшим представлением необработанных двоичных данных, чем строка.

...