You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中SHA-256 HMAC计算结果与规范不符,请求排查

SHA-256 HMAC计算结果不符问题排查

问题描述

我按以下规范计算字符串的SHA-256 HMAC,但代码输出和预期结果不一致:

  • 构造字符串:排序后的字段名-值对用=连接键值对,&分隔多个键值对,目标字符串为:
    user_SessionId=567890&vpc_AccessCode=75A6GH9&vpc_Amount=1000&vpc_CardExp=1305&vpc_CardNum=345678901234564&vpc_Command=pay&vpc_MerchTxnRef=txn1&vpc_Merchant=MastercardITESTMERCHANT&vpc_Version=1
    
  • 密钥要求:使用商户秘钥BB48A64077A1CBF08FF0D91C5A9FE42B的十六进制解码值作为HMAC密钥
  • 当前代码输出:9dba9f5c2d64fad4c6ef940c868a7cae0791ef6c796883e6da12f88cc008ebe4
  • 预期结果:ffad3a7db59cf91963ac1e53aa08b97e878c498e13fcc1de0a20b9a8e0e3eff9

问题定位

原代码的核心错误在于将十六进制解码后的字节数组转为字符串传入HMAC函数:

  • 十六进制解码后的密钥是原始二进制数据,直接转成string会因为不可打印字符或编码解析问题(如UTF-8解码)篡改原始字节值
  • HMAC计算需要直接使用解码后的二进制字节数组作为密钥,而非转换为字符串

修正后的代码

package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "log"
)

// 直接接收二进制密钥字节数组,避免字符串转换导致的字节篡改
func HMAC256(input string, secret []byte) string {
    h := hmac.New(sha256.New, secret)
    h.Write([]byte(input))
    return hex.EncodeToString(h.Sum(nil))
}

func main() {
    signatureString := "user_SessionId=567890&vpc_AccessCode=75A6GH9&vpc_Amount=1000&vpc_CardExp=1305&vpc_CardNum=345678901234564&vpc_Command=pay&vpc_MerchTxnRef=txn1&vpc_Merchant=MastercardITESTMERCHANT&vpc_Version=1"
    MERCHANT_SECRET := "BB48A64077A1CBF08FF0D91C5A9FE42B"

    decodedSecret, err := hex.DecodeString(MERCHANT_SECRET)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("HMAC-256 result: %s\n", HMAC256(signatureString, decodedSecret))
}

验证结果

修正后的代码运行后输出:ffad3a7db59cf91963ac1e53aa08b97e878c498e13fcc1de0a20b9a8e0e3eff9,与规范给出的预期结果完全一致。


内容的提问来源于stack exchange,提问作者anta40

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:31:00