【问题标题】:createHmac gives two different outputs from BuffercreateHmac 从 Buffer 中给出两种不同的输出
【发布时间】:2019-10-29 19:39:39
【问题描述】:

考虑这个 Buffer base64-decoded

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

【问题讨论】:

    标签: node.js cryptography hmac


    【解决方案1】:

    如果未指定编码,Buffer.toString() 会将缓冲区内容转换为具有utf8 编码的字符串。 crypto.createHmac 如果是字符串类型,则在键上使用 Buffer.from()。这个函数也默认使用utf8编码。所以应该可以。

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

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

    【讨论】:

    • 谢谢兄弟,它帮助我思考我的问题,并找到了解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多