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

Java空字节IV AES-GCM模式加密JSON时MAC校验值不匹配问题求解

问题诱因

  • 密钥解码错误:你提供的密钥是十六进制格式字符串,若代码中未将其解码为原始字节数组,直接使用字符串的字节数组作为密钥,会导致密钥实际值与预期不符,最终MAC计算结果不匹配。
  • JSON输入字节不一致:若实际加密时传入的JSON字节数组存在多余空格、换行、键序调整,或使用了带BOM的UTF-8编码,会导致GCM计算MAC的输入明文和预期不一致,触发MAC校验失败。
  • 附加认证数据(AAD)不匹配:如果生成预期值的加密流程传入了自定义AAD数据,但你的Java代码未调用cipher.updateAAD()传入对应AAD,GCM生成的MAC必然和预期不一致,这是GCM模式的固有特性。
  • 输出结构不匹配:Java AES-GCM默认输出格式为「密文+16字节标签」,如果预期输出结构为「IV+密文+标签」或「标签+密文」,会导致提取的MAC部分和预期值错位不匹配。

修复方案

  1. 正确解码十六进制密钥:先将十六进制密钥解码为32字节原始字节数组,再传入密钥规范:
// 示例使用org.apache.commons.codec.binary.Hex做十六进制解码
byte[] secretKey = Hex.decodeHex("083080D3D0C521C02CD3AE2134363D09EA50DFF914677FAB9E22F18F9C28A3B9".toCharArray());
SecretKeySpec keySpec = new SecretKeySpec(secretKey, "AES");
  1. 对齐JSON输入字节:直接使用给定的JSON字符串生成UTF-8字节数组,不要通过JSON序列化工具重新生成,避免格式偏差:
byte[] payload = "{\"Parameter1\":\"Value1\",\"Parameter2\":\"Value2\",\"Parameter3\":\"Value3\"}".getBytes(StandardCharsets.UTF_8);
  1. 补充匹配的AAD参数:确认生成预期值的加密流程是否使用了AAD,若有则在加密时传入对应AAD:
// 初始化Cipher后、执行doFinal前调用updateAAD传入对应字节数组
cipher.updateAAD(aadBytes);
  1. 对齐输出结构:如果预期输出需要包含前置IV,可将12字节全0IV拼接在加密结果前;如果预期标签前置,将加密结果后16字节移到最前面即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:06:00