createHmac 从 Buffer 给出两个不同的输出

createHmac gives two different outputs from Buffer

考虑这个 Buffer 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==

这让我很困惑,我期待的是相同的输出。在 createHmac 中使用 Buffer 如何设法给出不同的输出?


我应该如何更改我的第二个函数,以便它提供与第一个函数相同的输出? 我尝试创建一个使用 createHmac 的节点包的浏览器端口,一切都运行良好,但 window.crypto.subtle.sign (HMAC) 也给出了不同的输出,因为我不知道如何使用缓冲区。

如果没有指定编码,Buffer.toString() converts the buffer content to a string with utf8 encoding. crypto.createHmac uses Buffer.from()如果是字符串类型的key。该函数默认也使用utf8编码。这样应该可以。

但是 - 正如您所经历的 - 有一个警告:Buffer.from('key', 'base64') 的输出不是有效的 utf8 数据。因此转换为 utf8 会导致数据丢失。不幸的是,这个 does not throw an error.

最好的解决方案是坚持使用 Buffer,它比字符串更好地表示原始二进制数据。