问题背景
今天调试售票系统的加密,发现加密解密再JDK10下面是ok的,再JDK8下面就GG了,搞了半天,后来发现,原来另有原因,是个坑。
Exception in thread "main" java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
at javax.crypto.Cipher.implInit(Cipher.java:805)
at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
at javax.crypto.Cipher.init(Cipher.java:1396)
at javax.crypto.Cipher.init(Cipher.java:1327)
at com.software.dev.util.MainEntrance.Encrypt(MainEntrance.java:83)
at com.software.dev.util.MainEntrance.main(MainEntrance.java:23)
听说,在使用JCE加密时java.security.InvalidKeyException:illegal Key Size
这个报错是因为用到了jdk sercurity, 而jdk sercurity 使用的jar包 $JAVA_HOME/jre/lib/security/local_policy.jar
和 $JAVA_HOME/jre/lib/security/US_export_policy.jar
中有对技术出口的限制,限制了加密只有128bit,而没有限制的则有256bit。
解决方案
贸易战争是无情的,但Oracle还是假装很贴心的再官网给我们提供了解决方案:
-
JDK6密码扩展无限制权限策略文件
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html -
JDK7密码扩展无限制权限策略文件
https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html -
JDK8密码扩展无限制权限策略文件
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载后,覆盖到$JAVA_HOME/jre/lib/security
中去,主要是local_policy.jar
和 US_export_policy.jar
中
- 如果处理的是JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件即可(最好先备份)。
- 如果处理的是JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下覆盖原来文件即可(最好先备份)
最后,别忘了验证是否成功,如果没报错就ok了Process finished with exit code 0