亲测有效!
当使用 AES-256 或 AES-192 加密时,JDK 默认只支持 128 位密钥,会抛出 java.security.InvalidKeyException: Illegal key size 异常。这是由于 Java 的加密强度受限于 JCE(Java Cryptography Extension)策略。以下是解决方案的详细步骤:
适用于 JDK 8u144 及更早版本
手动下载并替换 JCE 无限制加密策略文件:
- 访问 Oracle 官方下载页面:JCE Unlimited Strength Jurisdiction Policy Files for JDK 8
- 下载对应的策略文件压缩包。
- 解压后得到
local_policy.jar和US_export_policy.jar两个文件。
替换原有策略文件:
- 定位到
$JAVA_HOME/jre/lib/security/目录。 - 备份原有的
local_policy.jar和US_export_policy.jar文件。 - 将下载的两个文件复制到该目录,覆盖原有文件。
- 重启 JVM 以使更改生效。
适用于 JDK 8u151 及更高版本
从 JDK 8u151 开始,可以通过设置系统属性启用无限制加密策略,无需手动替换文件:
-
在启动 JVM 时添加以下参数:
java-Djava.security.properties=/path/to/java.security -
或者在代码中设置:
javaSecurity.setProperty("crypto.policy", "unlimited");
验证无限制策略是否生效
可以通过以下代码验证无限制策略是否已启用:
java
import javax.crypto.Cipher;
public class CheckCryptoPolicy {
public static void main(String[] args) throws Exception {
int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES");
System.out.println("Max AES key length: " + maxKeyLen);
// 如果输出 2147483647,则表示无限制策略已启用
}
}
注意事项
- 替换策略文件前务必备份原有文件。
- 确保替换的文件与 JDK 版本匹配。
- 在分布式环境中,所有运行 JVM 的节点都需要进行相同配置。
- 某些旧版本可能需要同时替换 JDK 和 JRE 目录下的策略文件。
替代方案 如果无法修改 JCE 策略,可以考虑以下方法:
- 使用 Bouncy Castle 加密库替代 JDK 内置实现。
- 将加密算法降级为 AES-128。
- 使用分段加密方式处理长密钥。
总结 通过替换 JCE 无限制策略文件或设置系统属性,可以解决 AES 加密时的密钥长度限制问题。建议优先使用官方提供的解决方案,并根据实际 JDK 版本选择合适的方法。