Illegal key size or default parameters问题解决
这个错误,常出现在 Java 运行环境中使用加密(如 AES)时,是因为当前的 Java 环境 不支持使用大于 128 位密钥的加密算法(比如 AES-256),因为默认 JDK 出于政策限制(如美国出口限制)默认只支持 128 位密钥。
解决方案
方法一:更换为支持 256 位加密的 JDK(推荐)
从 Java 8u161 之后的版本开始,Oracle 官方已经取消了这个限制。所以你可以把Jar包升级到这个版本以上就可以了。一般来说新版本好像是默认开启的,如果没开启可以按以下步骤来:
操作步骤:
-
找到你的 JDK 安装目录,打开
/jre/lib/security/java.security
:JAVA_HOME/jre/lib/security/java.security
-
打开
java.security
文件,搜索:crypto.policy=
-
改成:
crypto.policy=unlimited
-
保存,重启程序。
方法二:下载JCE
如果没法升级Jar包的版本,那可以下载JCE包。
JDK8的在这:
JCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download
下载下来之后,还是一样打开 JDK安装目录 打开 /jre/lib/security 目录,里面会有两个Jar包:local_policy.jar,US_export_policy.jar。把下载下来的同名Jar包覆盖进去就行了。
方法三:换成 128 位的密钥
当然如果你只是临时测试,不要求加密强度,可以把密钥长度限制在 128 位
如何确认你当前 JDK 支持多少位密钥?
可以运行以下代码测试:
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);}
}
输出: 如果是 128,说明你当前的 JDK 只支持 128 位密钥。 如果是 2147483647,说明支持无限长度(即支持 AES-256)。