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
,它比字符串更好地表示原始二进制数据。
考虑这个 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
,它比字符串更好地表示原始二进制数据。