在公司实现一个需求,其中须要实现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