考虑这个以base64解码的Buffer
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==
这真的使我感到困惑,我期望获得相同的输出。 Buffer
中的createHmac
如何用于提供不同的输出?
我应该如何更改第二个函数,使其提供与第一个函数相同的输出?
我尝试为使用createHmac
的节点程序包创建一个浏览器端口,一切运行正常,但是window.crypto.subtle.sign
(HMAC)也给出了不同的输出,因为我不知道如何使用缓冲区。
答案 0 :(得分:2)
如果未指定编码,则Buffer.toString()
将缓冲区内容转换为具有utf8
编码的字符串。 crypto.createHmac
如果为字符串类型,则在键上使用Buffer.from()
。默认情况下,此函数还使用utf8
编码。这样就可以了。
但是-正如您所经历的-有一个警告:Buffer.from('key', 'base64')
的输出不是有效的utf8数据。因此,转换为utf8
会导致数据丢失。不幸的是,这个does not throw an error。
最好的解决方案是坚持使用Buffer
,它比字符串更好地表示原始二进制数据。