Как сгенерировать 32-байтовый хэш SHA256 с использованием nodejs (crypto), чтобы избежать ошибки неправильного размера ключа, выдаваемой tweetnacl.js?

Я использую crypto модуль node.js для создания хэша SHA256 следующим образом:

const key = crypto.createHmac('sha256', data).digest('hex');

Теперь tweetnacl выдает ошибку: bad key size, когда ключ передается в secretbox:

nacl.secretbox(data, Rnonc, key);

Параметры преобразуются в Uint8Array, поскольку secretbox требует, чтобы аргументы были Uint8Array.

Ошибка: bad key size выброшено из здесь в tweetnacl поскольку crypto_secretbox_KEYBYTES определяется как 32 здесь. Проблема в том, что ключ, возвращаемый из crypto, имеет размер не 32 байта.

Я искал SO и соответствующие сайты, но не смог найти подходящего решения, кроме как в соответствии с этим - хэш SHA256, преобразованный в шестнадцатеричный, дает:

32 отдельных шестнадцатеричных числа (или 32 байта)

Как я могу сгенерировать ключ SHA256 размером 32 байта, чтобы избежать этой ошибки с помощью node.js? Есть ли что-то, что я делаю неправильно при создании хэша SHA256?


person Abrar    schedule 23.08.2018    source источник
comment
Не могли бы вы попробовать это? const key = crypto.createHmac('sha256', data).digest('base64'); Также попробуйте распечатать ключ внутри функции и попробовать обработать его локально один раз.   -  person Arihant    schedule 23.08.2018
comment
Я пробовал с crypto.createHmac('sha256', data).digest('base64'), все равно получаю bad key size   -  person Abrar    schedule 23.08.2018
comment
Есть несколько вызовов для checkLengths. Не могли бы вы указать строку, где вы получаете эту ошибку?   -  person Arihant    schedule 23.08.2018
comment
Я получаю его от здесь   -  person Abrar    schedule 23.08.2018
comment
Можете ли вы попробовать добавить cosole.log(k); cosole.log(k.length); внутри функции и посмотреть, что такое k? Вы можете получить ключ..   -  person Arihant    schedule 23.08.2018
comment
Для key я получаю массив Uint8Array в качестве вывода, подобный этому [98, 87, 122, 87, 77, 111, 83, 43, 83, 107, 101, 54, 101, 117, 120, 75, 78...., длиной 44. Любая идея, как я могу преобразовать его в 32 байта?   -  person Abrar    schedule 23.08.2018
comment
Эта ссылка может вам помочь. stackoverflow.com/questions/44796371/   -  person Arihant    schedule 23.08.2018


Ответы (1)


Следующий фрагмент кода решил проблему создания 32-байтового хэша SHA256, избегая ошибки неправильного размера ключа, выдаваемой tweetnacl.js:

const CryptoJS = require('crypto-js');

let hash   = CryptoJS.SHA256('hello world');
let buffer = Buffer.from(hash.toString(CryptoJS.enc.Hex), 'hex');
let array  = new Uint8Array(buffer);

Это всегда генерирует Uint8Array размером 32 байта. Обратите внимание, что здесь мне пришлось использовать модуль crypto-js, хотя я предпочел использовать собственный модуль crypto, но я думаю, что сейчас я бы просто использовал его, так как это рабочее решение.

Спасибо @Arihant за указание на это (см. раздел комментариев)

person Abrar    schedule 24.08.2018