项目场景:
通过微信商家转账到零钱(v3接口)需要从微信后台下载证书文件,下载完成后需要使用32位(128bit)密钥通过AES解密证书信息,最后写入文件保存。
问题描述
今天线上出现java.security.InvalidKeyException: Illegal key size
异常,经排查测试,配置无任何问题,在开发环境运行,可以正常下载解密证书文件信息。
Caused by: 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.wechat.pay.contrib.apache.httpclient.util.AesUtil.decryptToString(AesUtil.java:40)
...
原因分析:
我们需要要了解一个新的东西——JCE。在Java的核心类库中有一个JCE(Java Cryptography Extension),JCE是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现,所以这个是实现加密解密的重要类库。
在Linux环境中出现java.security.InvalidKeyException: Illegal key size
异常通常是由于Java默认的加密限制引起的。Java默认的加密强度限制了加密算法密钥的最大长度。
因为JDK受版本安全限制,默认只允许128位长度以内的秘钥长度,如果密钥大于128位, 会抛出java.security.InvalidKeyException: Illegal key size
异常。
java运行时环境默认读到的是受限的policy文件,文件位于${JAVA_HOME}/jre/lib/security
,这种限制是因为美国对软件出口的控制所造成的,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制,JDK1.8之后已经兼容了该问题。
解决方案:
1.升级不受限制的JDK版本
将jdk版本升级到jdk9及以上。
2.替换JCE无限制权限策略文件
去官方下载JCE无限制权限策略文件。
JDK5的下载地址: Java Cryptography Extension (JCE) Unlimited Str