由于出口限制等方面的原因, JDK 8u151
之前的版本限制了一些加密算法的key最大长度。 JDK 8u151
后提供了不限制的Policy可以通过修改配置或运行时来配置, JDK 8u161
之后默认使用了不限制的Policy。
在受限情况下如果使用256位的key进行加解密,会报 InvalidKeyException: Illegal key size
,如下:
java.security.InvalidKeyException: Illegal key size at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1038) at javax.crypto.Cipher.implInit(Cipher.java:804) at javax.crypto.Cipher.chooseProvider(Cipher.java:863) at javax.crypto.Cipher.init(Cipher.java:1395) at javax.crypto.Cipher.init(Cipher.java:1326)
因此如果使用的稍旧的JDK版本,需要支持256位key的加解密根据JDK版本有以下方式,
JDK 8u151之前的版本
需要替换 $JAVA_HOME/jre/lib/security
下面中 US_export_policy.jar
和 local_policy.jar
两个文件,这2个文件中原始的内容如下,限制了各种算法的最大key的位数。
// local_policy.jar中内容 grant { permission javax.crypto.CryptoPermission "DES", 64; permission javax.crypto.CryptoPermission "DESede", *; permission javax.crypto.CryptoPermission "RC2", 128, "javax.crypto.spec.RC2ParameterSpec", 128; permission javax.crypto.CryptoPermission "RC4", 128; permission javax.crypto.CryptoPermission "RC5", 128, "javax.crypto.spec.RC5ParameterSpec", *, 12, *; permission javax.crypto.CryptoPermission "RSA", *; permission javax.crypto.CryptoPermission *, 128; }; // US_export_policy.jar中内容 grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; };
不同jdk版本替换文件的下载地址:
把 US_export_policy.jar
和 local_policy.jar
两个文件复制到 $JAVA_HOME/jre/lib/security
下面。jar包中内容如下:
// US_export_policy.jar 和 local_policy.jar 都为以下内容 grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; };
JDK 8u151到JDK 8u161之间的版本
JDK 8u151
之后的版本, $JAVA_HOME/jre/lib/security/policy
下有2个文件夹: limited
和 unlimited
,里面的文件分别对应有限制的Policy和无限制的Policy,有2种方式可以通过以下方式放开限制:
修改JDK配置
把 $JAVA_HOME/jre/lib/security/java.security
文件中的 crypto.policy
配置修改为 unlimited
运行时修改
Security.setProperty("crypto.policy", "unlimited");