亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

預期的 MAC 不同于從 NodeJS 到 Go 服務器的傳入 MAC

預期的 MAC 不同于從 NodeJS 到 Go 服務器的傳入 MAC

Go
慕娘9325324 2022-08-01 15:25:24
我在嘗試在我的NodeJS和我的Go服務器之間實現HMAC時遇到問題?,F在,從我的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 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號