预期的 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的两倍。不知道为什么会这样。

http://img1.mukewang.com/62e77ff900017c6503340097.jpg

慕娘9325324
浏览 85回答 1
1回答

MM们

它们似乎产生相同的结果,但您在 Node 代码中传递给摘要调用的编码是 。如果在两端以相同的方式对返回进行编码,则它们应该匹配。'hex'const crypto = require('crypto')const generateMAC = (message, secret) =>&nbsp; crypto.createHmac('sha256', secret).update(message).digest('base64')console.log(generateMAC('foo', 'bar'))package mainimport (&nbsp; &nbsp; "crypto/hmac"&nbsp; &nbsp; "crypto/sha256"&nbsp; &nbsp; "encoding/base64"&nbsp; &nbsp; "fmt")func generateMAC(message []byte, secret []byte) string {&nbsp; &nbsp; mac := hmac.New(sha256.New, secret)&nbsp; &nbsp; _, err := mac.Write(message)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return "oh no"&nbsp; &nbsp; }&nbsp; &nbsp; return base64.StdEncoding.EncodeToString(mac.Sum(nil))}func main() {&nbsp; &nbsp; fmt.Println(generateMAC([]byte("foo"), []byte("bar")))}这两者都产生相同的输出,因为它们都编码为base64:。FHkzIYqqvAuLEKKzpcNGhMjZQ0G88QpHNtxycPd0GFE=.digest()如果未指定编码,则默认返回缓冲区,然后也可以使用这些编码之一在单独的编码中使用该缓冲区。.toString()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go