【小坑速記】JDK加解密Key長度限制
由於出口限制等方面的原因,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版本替換檔案的下載地址:
- java6:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
- java7:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
- java8:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
把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");