配置里 cipher.key 只写了 16 个字符,初始化 Cipher 时报 Invalid AES key length: 16 bytes,服务启动失败,本地因为换了 JDK 没复现。乍看像缓存或者权限的锅,追下去往往不是。
printf '%s' $CIPHER_KEY | wc -c grep -n 'aes-256' src/main/resources/application.yml java -version
追下去是这么回事:AES-256 需要 32 字节密钥,16 字节只能用于 AES-128。配置项名字叫 aes-256 但值按 16 字节生成,长度对不上。JDK 8 低版本还要额外的 unlimited 策略文件,报错信息会指向另一个方向。
碰到「密钥长度不足」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,启动时校验密钥长度 不是 32 字节直接失败并打印实际长度;改用 Base64 存密钥 解码后固定 32 字节;确认 JDK 8 装了 unlimited 策略或升到 8u161 以上;用新密钥重启 发一笔加密请求验证。
验收就看一点,启动日志打印密钥长度 32 加密请求正常返回 不再有 InvalidKeyException。
