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字节密钥,两端需确保密钥长度合规,避免因填充/截断逻辑差异导致密钥不一致。
- Node端若从字符串转Buffer,需明确编码(如
附加认证数据(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,两端需统一使用同一种编码。
- 如Node端用
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

