由于出口限制等方面的原因,JDK 8u151之前的版本限制了一些加密算法的key最大长度。JDK 8u151后提供了不限制的Policy可以通过修改配置或运行时来配置,JDK 8u161之后默认使用了不限制的Policy。

在受限情况下如果使用256位的key进行加解密,会报InvalidKeyException: Illegal key size,如下:

1
2
3
4
5
6
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.jarlocal_policy.jar两个文件,这2个文件中原始的内容如下,限制了各种算法的最大key的位数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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.jarlocal_policy.jar 两个文件复制到 $JAVA_HOME/jre/lib/security 下面。jar包中内容如下:

1
2
3
4
5
// 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个文件夹:limitedunlimited,里面的文件分别对应有限制的Policy和无限制的Policy,有2种方式可以通过以下方式放开限制:

  • 修改JDK配置
    $JAVA_HOME/jre/lib/security/java.security文件中的crypto.policy配置修改为unlimited

  • 运行时修改
    Security.setProperty("crypto.policy", "unlimited");