最近跟一家供应商对接系统,需要将订单推送给供应商,然后供应商进行后续处理。供应商提供的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
按照上面的情况操作完之后,再次运行上面的代码,一次通过,搞定!