解决JDK无法使用256位密钥AES加密的问题

作者 胡萝虎 日期 2021-11-16
解决JDK无法使用256位密钥AES加密的问题

最近跟一家供应商对接系统,需要将订单推送给供应商,然后供应商进行后续处理。供应商提供的API接口需要使用AES对接口报文进行加密,本以为就是简单调用JDK提供的库加密即可,结果我天真了。。。

发生了什么

供应商提供的AES密钥长度是256位,轻车熟路,面向百度编程,几分钟搞定,代码如下:

SecretKeySpec aesKeySpec = new SecretKeySpec("256位的密钥".getBytes(StandardCharsets.UTF_8), "AES");
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//加密模式
aesCipher.init(Cipher.ENCRYPT_MODE, aesKeySpec);

//开始加密
byte[] encryptSourceBytes = aesCipher.doFinal("待加密的内容".getBytes(StandardCharsets.UTF_8));
String encryptSource = Base64.encodeBase64String(encryptSourceBytes);

OK,那就跑起来吧,结果。。。。

java.security.InvalidKeyException: Illegal key size

什么情况?看来还得需求百度帮助。通过一通搜索,总算搞清楚原因了。

受美国法律限制,JDK默认只支持128位及以下长度密码的加密,超过这个长度后,需要魔法处理!!!

解决方案

处理方法分3个情况,具体看使用的JDK版本,分别如下:

  1. 如果使用的是Java9, Java 8u161, Java 7u171 和Java 6u181 这些版本的JDK,现在已经默认解除了这个限制,无需处理

  2. 从 Java 8u151开始可以通过编程的方式解除密钥长度限制,即在加解密之前,先执行下面的代码:

    Security.setProperty("crypto.policy", "unlimited");
  1. 其他的版本,相对比较麻烦。

    • 首先根据JDK的大版本,下载对应的jce库

    • 然后将下载的jce库zip包解压,将解压后的两个jar(local_policy.jar和US_export_policy.jar)复制到jdk目录下are/lib/security目录下即可

      比如MacOS下的JDK目录

      /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security

      image-20211116215525186

按照上面的情况操作完之后,再次运行上面的代码,一次通过,搞定!

“扫一扫接着看”