如何使用 nodejs(加密)生成 32 字节的 SHA256 哈希以避免从 tweetnacl.js 抛出错误的密钥大小错误?

How to generate a SHA256 hash of 32 bytes using nodejs (crypto) in order to avoid bad key size error thrown from tweetnacl.js?

我正在使用 node.js 的 crypto 模块来生成这样的 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 是从 here in tweetnacl since the crypto_secretbox_KEYBYTES is defined as 32 here 抛出的。问题是从 crypto 返回的密钥不是 32 字节大小。

我搜索了 SO 和相关站点,但找不到任何可行的解决方案,但根据 this - 转换为十六进制的 SHA256 哈希生成:

32 separate hexadecimal numbers (or 32 bytes)

如何使用 node.js 生成 32 字节的 SHA256 密钥以避免此错误?在生成 SHA256 哈希时我做错了什么吗?

以下代码片段解决了生成 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);

这总是生成 32 字节大小的 Uint8Array。注意这里我不得不使用 crypto-js 模块,虽然我更喜欢使用原生的 crypto 模块,但我想我现在会使用它,因为它是一个可行的解决方案。

感谢@Arihant 指向 this(查看评论部分)