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

Node.js AES-256-GCM加密Token在Golang中解密失败排查

AES-256-GCM跨Node.js/Go解密失败(message authentication failed)排查方案

以下是导致该错误的常见原因及排查方向:

  • IV长度或解析逻辑不一致
    AES-GCM标准推荐使用12字节(96位)的IV,若Node端生成的IV长度不符,或Go端解析时截取长度错误,会直接触发认证失败。检查Node端IV生成代码(比如是否用crypto.randomBytes(12)),Go端需确保正确提取对应长度的IV。

  • 密钥处理不匹配
    确认两端密钥完全一致:

    • Node端若从字符串转Buffer,需明确编码(如Buffer.from(key, 'utf8')或Buffer.from(key, 'hex'));
    • Go端解析密钥时,需使用相同编码(如[]byte(key)对应UTF-8,或hex.DecodeString处理十六进制密钥);
      注意AES-256要求32字节密钥,两端需确保密钥长度合规,避免因填充/截断逻辑差异导致密钥不一致。
  • 附加认证数据(AAD)未同步
    若Node端加密时调用了setAAD()传入附加数据,Go端解密时必须传入完全相同的AAD,否则会触发认证失败。检查两端是否遗漏或错误传递AAD。

  • 密文与标签拼接/拆分逻辑错误
    Node.js加密后默认返回密文+标签的拼接Buffer(标签默认16字节),Go端解密时需将最后16字节单独提取为标签,剩余部分作为密文:

    // Go端示例拆分逻辑
    tag := ciphertext[len(ciphertext)-16:]
    ciphertext = ciphertext[:len(ciphertext)-16]
    

    若Node端是分开返回密文和标签,或Go端拆分位置错误,会导致认证失败。

  • 编码/解码标准不统一
    若Token经过Base64或Hex编码传输,需确保两端编码规则一致:

    • 如Node端用buffer.toString('base64'),Go端需用base64.StdEncoding.DecodeString();
    • 注意区分标准Base64和URL-safe Base64,两端需统一使用同一种编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:22