微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

预期的 MAC 不同于从 NodeJS 到 Go 服务器的传入 MAC

如何解决预期的 MAC 不同于从 NodeJS 到 Go 服务器的传入 MAC

我在尝试在 NodeJS 和 Go 服务器之间实现 HMAC 时遇到问题。现在,我的 Go 服务器生成的预期 MAC 与来自我的 NodeJS 服务器的实际 MAC 不同。

// NodeJS generated MAC
const generateMAC = (message,secret) => {
  return crypto.createHmac('sha256',secret).update(message).digest('hex');
};

req.headers['blocklist-auth'] = generateMAC(
  JSON.stringify(req.body),secret
);

Go HMAC Validation(从 NodeJS 接收 MAC 并尝试 tp 验证)

func generateMAC(message []byte,secret []byte) []byte {
    mac := hmac.New(sha256.New,secret)
    _,err := mac.Write(message)
    if err != nil {
        return nil
    }
    s := mac.Sum(nil)
    return s
}

// ValidMAC reports whether messageMAC is a valid HMAC tag for message.
func validMAC(message []byte,messageMAC []byte,secret []byte) bool {
    expectedMAC := generateMAC(message,secret)
    log.Infof("E: %s -- M: %s",string(expectedMAC),string(messageMAC),)
    return hmac.Equal(messageMAC,expectedMAC)
}

在调试时,我记录了预期 MAC 和实际 MAC 的样子

预期: n\ufffd\ufffdmi\u0015\ufffd|\ufffdE\ufffd\ufffd>\ufffd\u000e0\u0012C1\ufffd\ufffd\ufffds?!\u001a|\ufffdH<!

实际:

55d31eb5caf5f5046d054fcf39721ba273cd97da66f663f8337e10ac62045197

我注意到预期和实际 MAC 之间的长度也不同。来自 NodeJS 的长度是预期 MAC 的两倍。不知道为什么会这样。

enter image description here

解决方法

它们似乎产生相同的结果,但传递给 Node 代码中的摘要调用的编码是 []。 如果您在两端以相同的方式对返回值进行编码,则它们应该匹配。

'hex'
const crypto = require('crypto')
const generateMAC = (message,secret) =>
  crypto.createHmac('sha256',secret).update(message).digest('base64')
console.log(generateMAC('foo','bar'))

这两个产生相同的输出,因为它们都编码为 base64:package main import ( "crypto/hmac" "crypto/sha256" "encoding/base64" "fmt" ) func generateMAC(message []byte,secret []byte) string { mac := hmac.New(sha256.New,secret) _,err := mac.Write(message) if err != nil { return "oh no" } return base64.StdEncoding.EncodeToString(mac.Sum(nil)) } func main() { fmt.Println(generateMAC([]byte("foo"),[]byte("bar"))) }

如果未指定编码,

FHkzIYqqvAuLEKKzpcNGhMjZQ0G88QpHNtxycPd0GFE= 默认返回一个缓冲区,然后您也可以使用 these encodings 之一在单独的 .digest() 中使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。