为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕娘9325324 2022-08-01 15:25:24
我在尝试在我的NodeJS和我的Go服务器之间实现HMAC时遇到问题。现在,从我的Go服务器生成的预期MAC与来自我的NodeJS服务器的实际MAC不同。// NodeJS generated MACconst 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的两倍。不知道为什么会这样。
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

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


const crypto = require('crypto')

const generateMAC = (message, secret) =>

  crypto.createHmac('sha256', secret).update(message).digest('base64')

console.log(generateMAC('foo', 'bar'))

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")))

}

这两者都产生相同的输出,因为它们都编码为base64:。FHkzIYqqvAuLEKKzpcNGhMjZQ0G88QpHNtxycPd0GFE=


.digest()如果未指定编码,则默认返回缓冲区,然后也可以使用这些编码之一在单独的编码中使用该缓冲区。.toString()


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信