createHmac从Buffer提供两个不同的输出

时间:2019-10-29 19:39:39

标签: node.js cryptography hmac

考虑这个以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)也给出了不同的输出,因为我不知道如何使用缓冲区。

1 个答案:

答案 0 :(得分:2)

如果未指定编码,则Buffer.toString()将缓冲区内容转换为具有utf8编码的字符串。 crypto.createHmac如果为字符串类型,则在键上使用Buffer.from()。默认情况下,此函数还使用utf8编码。这样就可以了。

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

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