解决 Java 中的 Illegal key size 异常
当使用 Cipher.init() 方法时遇到 java.security.InvalidKeyException: Illegal key size 异常,通常是由于 Java 加密扩展(JCE)的默认策略限制了加密算法的密钥长度。
1 |
|
以下是详细的解决方案和背景说明:
异常原因
Java 安装时默认包含的 JCE 权限策略文件(local_policy.jar 和 US_export_policy.jar)受限于加密出口管制,对部分加密算法的密钥长度做了限制(如 AES 密钥默认最大支持 128 位)。当使用更长的密钥(如 192 位、256 位)时,就会触发此异常。
解决方案
针对 JDK 7 / JDK 8(低于 8u161 版本)
需要手动替换 JCE 无限制权限策略文件:
- 步骤 1:下载无限制策略文件
根据 JDK 版本下载对应文件:- JDK 7:Oracle 官方下载
- JDK 8:Oracle 官方下载
- 步骤 2:替换策略文件
- 解压下载的压缩包,得到
local_policy.jar和US_export_policy.jar。 - 找到 JDK 安装目录下的安全策略文件夹:
- 路径:
${JAVA_HOME}/jre/lib/security(注意区分 JDK 和 JRE 目录,需替换 JDK 内置 JRE 的文件)。
- 路径:
- 备份原有文件(可选),将下载的两个 JAR 文件复制到该目录,覆盖原有文件。
- 解压下载的压缩包,得到
- 步骤 3:重启应用
替换后需重启 Java 应用,新策略才能生效。
针对 JDK 8u161 及以上版本(包括 JDK 9+)
无需手动替换文件!从 JDK 8u161 开始,Oracle 已默认启用 无限制加密策略,只需通过以下方式确认配置:
检查 JRE 安全配置文件:
路径:${JAVA_HOME}/jre/lib/security/java.security
确保包含以下配置(默认已开启):1
=unlimited
若未开启,手动添加上述配置并重启应用即可。
验证解决方案
可通过以下代码验证密钥长度限制是否解除:
1 | import javax.crypto.Cipher; |
- 若运行不抛异常,说明无限制策略生效;
- 若仍抛异常,检查 JDK 版本是否正确、文件是否替换到正确目录。
注意事项
- 多 JDK 环境:确保应用使用的 JDK 是已替换策略文件的版本(通过
echo $JAVA_HOME或java -version确认)。 - OpenJDK 兼容性:部分 OpenJDK 发行版(如 AdoptOpenJDK)默认已解除限制,无需额外配置。
- 法律合规:使用无限制加密策略需遵守当地法律法规,确保符合加密算法出口和使用规定
v1.3.10