Java默认不支持AES256的解决方法(java.security.InvalidKeyException: Illegal key size or default parameters)

近日在做微信支付相关的业务,微信支付对部分接口的返回值(如退款结果通知回调接口)做了AES256的加密。然而Java默认是不支持256位的AES的,因而在解密时会报java.security.InvalidKeyException: Illegal key size or default parameters异常。

Oracle做这个限制的原因非常令人无语:美国在《武器出口管制法》中,将一定长度位数以上的加密算法视为武器,因而除非获得国防部和国家安全局的批准,否则禁止出口——即使这种算法是公开的。

在网上搜寻到了解决方法后,让运维对开发、测试环境JDK中的jar包做了替换,本来以为问题就此解决了,在线上环境操作时却发现了新的问题:为什么线上的JDK8里没有要替换的两个jar包?再次搜寻之后才发现,原来对于不同小版本的JDK8,解决方法是不一样的,而网上大部分解决方法只介绍了低版本JDK8的。

因而,在这里贴一下针对不同版本JDK的详细解决方案:

JDK 1.8.0_151前的版本:

JDK中只内置了不支持AES256的jar包,需要手动下载支持AES256的jar包并进行替换:

  1. 下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files:
    https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.htmlJDK6、JDK7的下载链接不同,在此一并贴出:
    JDK6:https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
    JDK7:https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
  2. 解压缩,将US_export_policy.jarlocal_policy.jar覆盖JDK安装目录\jre\lib\security\下的同名文件。

JDK 1.8.0_151后的版本:

JDK中内置了两种jar包,但默认启用不支持AES256的,需要修改配置文件以启用支持AES256的jar包:

修改JDK安装目录\jre\lib\security\java.security,将crypto.policy=unlimited这条配置前的注释#号删除:

从:

QQ截图20190426184840

改为:

QQ截图20190426184919