您当前的位置:首页 > 计算机 > 编程开发 > Java

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

时间:10-23来源:作者:点击数:
最近跟一家供应商对接系统,需要将订单推送给供应商,然后供应商进行后续处理。供应商提供的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");
    
  3. 其他的版本,相对比较麻烦。
    • 首先根据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

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门