最近跟一家供应商对接系统,需要将订单推送给供应商,然后供应商进行后续处理。供应商提供的API接口需要使用AES对接口报文进行加密,本以为就是简单调用JDK提供的库加密即可,结果我天真了。。。
发生了什么
供应商提供的AES密钥长度是256位,轻车熟路,面向百度编程,几分钟搞定,代码如下:
SecretKeySpec aesKeySpec = new SecretKeySpec("256位的密钥".getBytes(StandardCharsets.UTF_8), "AES"); |
OK,那就跑起来吧,结果。。。。
java.security.InvalidKeyException: Illegal key size |
什么情况?看来还得需求百度帮助。通过一通搜索,总算搞清楚原因了。
受美国法律限制,JDK默认只支持128位及以下长度密码的加密,超过这个长度后,需要魔法处理!!!
解决方案
处理方法分3个情况,具体看使用的JDK版本,分别如下:
如果使用的是Java9, Java 8u161, Java 7u171 和Java 6u181 这些版本的JDK,现在已经默认解除了这个限制,无需处理
从 Java 8u151开始可以通过编程的方式解除密钥长度限制,即在加解密之前,先执行下面的代码:
Security.setProperty("crypto.policy", "unlimited");
其他的版本,相对比较麻烦。
首先根据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
按照上面的情况操作完之后,再次运行上面的代码,一次通过,搞定!
“扫一扫接着看”