JDK1.7独立JAR运行AES加密报Illegal key size错误求助
独立JAR加密报错解决方法
java.security.InvalidKeyException: Illegal key size 报错的直接原因是当前运行环境的JCE权限策略限制了AES密钥最大长度为128位,而你的代码中使用了24字节(192位)的AES密钥,超出了限制。你替换JCE策略包后WAR包运行正常、独立JAR仍报错,本质是独立JAR运行时加载的JRE环境没有正确应用无限制JCE策略,按以下步骤排查解决:
1. 确认独立JAR实际使用的JRE路径
Windows环境下通常会同时安装JDK内置JRE和系统公共JRE两个独立的Java运行环境,如果你只替换了JDK目录下的策略文件,但独立JAR启动时调用的是公共JRE的java.exe,修改自然不会生效:
- 在启动独立JAR的命令行窗口执行
where java,输出的第一条路径就是当前实际生效的java可执行文件位置 - 找到该路径对应的JRE根目录:比如路径为
C:\Program Files\Java\jre7\bin\java.exe,对应JRE根目录就是C:\Program Files\Java\jre7\ - 将无限制版本的
local_policy.jar和US_export_policy.jar复制到该JRE根目录下的lib/security文件夹,覆盖原有文件,替换前需关闭所有运行中的Java进程,避免文件锁定导致替换失败
2. 校验JCE策略是否生效
用和运行独立JAR完全相同的java命令,运行以下校验代码,确认策略是否生效:
import javax.crypto.Cipher; public class JceCheck { public static void main(String[] args) { int maxKeyLength = Cipher.getMaxAllowedKeyLength("AES"); System.out.println("当前环境AES支持的最大密钥长度:" + maxKeyLength); } }
- 输出为
2147483647时,说明无限制JCE策略已生效,原有加密代码可正常运行 - 输出为
128时,说明当前JRE仍加载的是受限权限策略,继续排查冲突问题
3. 排查类加载冲突
如果校验结果仍显示128位密钥上限,检查是否存在类加载冲突:
- 检查独立JAR的启动参数,是否配置了
-Djava.endorsed.dirs或-Djava.ext.dirs参数指向包含旧版JCE包的目录,这类路径下的类会优先于JRE核心类被加载 - 检查独立JAR内部打包的依赖目录,是否自带了
local_policy.jar、US_export_policy.jar或其他第三方JCE相关加密包,这类冲突包会导致你替换的JRE策略文件不生效,直接删除冲突包即可
免修改JRE的替代方案
如果不想修改全局JRE配置(比如需要将JAR分发到其他用户环境运行,无法要求所有用户手动替换JCE包),可以在代码层面绕过JCE限制,该方案在JDK7独立应用环境下可正常生效:
在Cipher初始化前,通过反射修改JCE的权限限制开关,代码如下:
import java.lang.reflect.Field; // 加密逻辑前调用该方法即可突破密钥长度限制,无需修改JRE文件 private static void disableJceRestriction() throws Exception { Field restrictField = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted"); restrictField.setAccessible(true); restrictField.set(null, Boolean.FALSE); }
如果服务端兼容128位AES加密,也可以直接将代码中Arrays.copyOf(digestOfPassword, 24)的长度参数从24改为16,使用128位密钥,默认JRE策略就原生支持,不需要任何额外配置。注意该调整必须和服务端加密逻辑保持一致,否则会出现加解密结果不匹配的问题。
内容的提问来源于stack exchange,提问作者Jayanta Pramanik
相关产品推荐
相关产品推荐

