最近跟一家供应商对接系统,需要将订单推送给供应商,然后供应商进行后续处理。供应商提供的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版本,分别如下:
- Security.setProperty("crypto.policy", "unlimited");
-
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security
按照上面的情况操作完之后,再次运行上面的代码,一次通过,搞定!