在公司實現一個需求,其中須要實現AES加密敏感數據,開發ok,測試ok,流程所有跑通,一切ok,測試小姐姐還在抱怨沒有bug可提完不成指標(哈哈,這tm還有指標)。
合代碼、上線!線上驗證時,悲劇發生了。。。
一個血淋淋的異常現場擺在面前:html
1 Caused by: java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size or default parameters 2 at com.example.demo.AESUtil.encryptService(AESUtil.java:96) 3 at com.example.demo.AESUtil.encrypt(AESUtil.java:70) 4 at com.example.demo.DataEncUtil.encrypt(DataEncUtil.java:23) 5 at com.example.demo.DemoApplication.main(DemoApplication.java:9) 6 ... 8 more 7 Caused by: java.security.InvalidKeyException: Illegal key size or default parameters 8 at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026) 9 at javax.crypto.Cipher.init(Cipher.java:1245) 10 at javax.crypto.Cipher.init(Cipher.java:1186) 11 at com.example.demo.AESUtil.encryptService(AESUtil.java:92) 12 ... 11 more
臥槽,什麼狀況,緊急回退後再次review代碼,沒問題啊,主分支丟到測試環境仍是那麼完美。。。java
翻閱資料,發現,oracle(sun)在jdk中作了一些限制:
在咱們安裝的JRE目錄下有這樣一個文件夾:%JAVE_HOME%\jre\lib\security,其中包含有兩個.jar文件:「local_policy.jar 」和「US_export_policy.jar」
由於美國的出口限制,Sun經過權限文件(local_policy.jar、US_export_policy.jar)作了相應限制。所以存在一些問題:
●密鑰長度上不能知足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters);
●部分算法未能支持,如MD四、SHA-224等算法;
●API使用起來還不是很方便;一些經常使用的進制轉換輔助工具未能提供,如Base64編碼轉換、十六進制編碼轉換等工具。
Sun被Oracle收購之後,Oracle在其官方網站上提供了無政策限制權限文件(Unlimited Strength Jurisdiction Policy Files),咱們只須要將其部署在JRE環境中,就能夠解決限制問題。
JDK8 jar包下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
JDK7 jar包下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK6 jar包下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
把裏面的兩個jar包:local_policy.jar 和 US_export_policy.jar 替換掉原來jdk安裝目錄%JAVE_HOME%\jre\lib\security 下的兩個jar包接能夠了。算法
另外,在這篇文章中也得知jdk在.java 8 161以上已經再也不限制密鑰長度。回頭看到測試機的版本在161以上,線上則是111,因此也就證明了這一分析。
https://blog.csdn.net/tangtao_xp/article/details/84944049oracle