我正在使用crypto Node.js 模块生成 SHA256 哈希,如下所示:
const key = crypto.createHmac('sha256', data).digest('hex');
现在,tweetnacl当 key 在 secretbox
中传递时,抛出错误:bad key size
:
nacl.secretbox(data, Rnonc, key);
参数被转换为 Uint8Array,因为 secretbox
要求参数为 Uint8Array。
错误:错误的 key 大小
是从here抛出的在 tweetnacl
中,因为 crypto_secretbox_KEYBYTES
被定义为 32
here 。问题是从 crypto
返回的 key 不是 32 字节大小。
我搜索了SO和相关网站,但找不到任何可行的解决方案,但根据this - 转换为十六进制的 SHA256 哈希产生:
32 separate hexadecimal numbers (or 32 bytes)
如何使用 node.js 生成 32 字节的 SHA256 key 以避免此错误?我在生成 SHA256 哈希值时做错了什么吗?
最佳答案
以下代码片段解决了生成 32 字节 SHA256 哈希值的问题,避免了 tweetnacl.js 引发的错误 key 大小错误:
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);
这总是生成一个 32 字节大小的 Uint8Array
。请注意,这里我必须使用 crypto-js
模块,尽管我更喜欢使用 native crypto
模块,但我想我现在只会使用它,因为它是一个可行的解决方案。
感谢@Arihant 指出this (查看评论部分)
关于javascript - 如何使用 nodejs(加密)生成 32 字节的 SHA256 哈希,以避免 tweetnacl.js 抛出错误的 key 大小错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51978889/