在公司实现一个需求,其中需要实现AES加密敏感数据,开发ok,测试ok,流程全部跑通,一切ok,测试小姐姐还在抱怨没有bug可提完不成指标(哈哈,这tm还有指标)。
合代码、上线!线上验证时,悲剧发生了。。。
一个血淋淋的异常现场摆在面前:
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代码,没问题啊,主分支丢到测试环境还是那么完美。。。
翻阅资料,发现,oracle(sun)在jdk中做了一些限制:
在我们安装的JRE目录下有这样一个文件夹:%JAVE_HOME%jrelibsecurity,其中包含有两个.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);
●部分算法未能支持,如MD4、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%jrelibsecurity 下的两个jar包接可以了。
另外,在这篇文章中也得知jdk在.java 8 161以上已经不再限制密钥长度。回头看到测试机的版本在161以上,线上则是111,所以也就证实了这一分析。
https://blog.csdn.net/tangtao_xp/article/details/84944049