最近在使用AES方式進(jìn)行加密,本來經(jīng)果測(cè)試已經(jīng)沒有問題,但是在更新了密鑰key之后,就出現(xiàn)了下列報(bào)錯(cuò)。
控制臺(tái)報(bào)錯(cuò)如下:
Exception in thread "main" java.lang.RuntimeException: Illegal key size or default parameters
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:98)
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:86)
at com.cupdata.oam.cardapply.kit.AesKit.decryptToStr(AesKit.java:56)
at com.cupdata.oam.cardapply.kit.AesKit.main(AesKit.java:194)
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
at javax.crypto.Cipher.implInit(Cipher.java:801)
at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
at javax.crypto.Cipher.init(Cipher.java:1249)
at javax.crypto.Cipher.init(Cipher.java:1186)
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:94)
... 3 more
網(wǎng)上搜索發(fā)現(xiàn),由于key的變更(由原來的128位變更為256位),導(dǎo)致加密/解密的失敗。
原來的密鑰:lNQqkL1BfSwt2MKw
新的密鑰: P_e-BhqDPP0yeMe8Ma43ZhhL6fqevuR8
之所以會(huì)出現(xiàn)這種問題,我們就要了解一個(gè)新的東西——JCE。在Java的核心類庫(kù)中有一個(gè)JCE(Java Cryptography Extension),JCE是一組包,它們提供用于加密、密鑰生成和協(xié)商以及 Message Authentication Code(MAC)算法的框架和實(shí)現(xiàn),所以這個(gè)是實(shí)現(xiàn)加密解密的重要類庫(kù)。
之所以會(huì)出現(xiàn)上述的報(bào)錯(cuò)問題:是因?yàn)锳ES在進(jìn)行加密處理的時(shí)候并沒有經(jīng)果特殊的處理,但是在使用256位密鑰加解密的時(shí)候,如果不進(jìn)行特殊處理的話,往往會(huì)出現(xiàn)報(bào)“java.security.InvalidKeyException: Illegal key size or default parameters”的異常。
問題解決
通過上面描述,我們知道了問題的所在,下面開始解決。我們要做的就是更換JCE的庫(kù),該文件位置在你的JDK/jre/lib/security 目錄下面,該目錄下我們可以看到兩個(gè)jar包:local_policy.jar,US_export_policy.jar,這兩個(gè)jar包是jdk自帶的。我們需要下載支持256位密鑰加密的jar包。
備注:一定要下載與自己JDK版本一致的JCE,否則無效。
JDK8:
其對(duì)應(yīng)的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下載完后,解壓,將其中的“l(fā)ocal_policy.jar ”和“US_export_policy.jar”兩個(gè)文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對(duì)應(yīng)的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK7:
其對(duì)應(yīng)的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
下載完后,解壓,將其中的“l(fā)ocal_policy.jar ”和“US_export_policy.jar”兩個(gè)文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對(duì)應(yīng)的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK6:
其對(duì)應(yīng)的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
下載完后,解壓,將其中的“l(fā)ocal_policy.jar ”和“US_export_policy.jar”兩個(gè)文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對(duì)應(yīng)的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK5:
其對(duì)應(yīng)的JCE下載地址為:http://download.csdn.net/detail/scs2043/4237335
下載完后,解壓,將其中的“l(fā)ocal_policy.jar ”和“US_export_policy.jar”兩個(gè)文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對(duì)應(yīng)的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
擴(kuò)展:
真實(shí)項(xiàng)目開發(fā)肯定在Linux中,前面我們知道Windos下更換JCE的方法,那么的Linux中怎么更換?如果你以為一樣去替換jar包,那就大錯(cuò)特錯(cuò)了,因?yàn)镴DK1.8以上的該目錄下壓根沒有這兩個(gè)JAR包。(如果真有,就直接替換)
針對(duì)這種情況,我們的解決方式為:vim 命令打開java.security文件,將注釋掉的 #crypto.policy=unlimited 打開,然后保存即可