之前文章有提到过(常用对称加密算法之AES算法-CBC模式),因为需求的需要,使用到了对称加密算法AES算法,开发完毕并测试通过了,但是后来有同事反馈,当他的项目使用到加密这一步的时候就会报错。
报错信息
java.security.InvalidKeyException: Illegal key size
// 加密 public static String encrypt(String password) throws Exception { Cipher cipher = Cipher.getInstance(INSTANCE); SecretKeySpec keySpec = new SecretKeySpec(BYTES_KEY, AES); // CBC模式需要生成一个16 bytes的initialization vector SecureRandom sr = SecureRandom.getInstanceStrong(); byte[] iv = sr.generateSeed(16); IvParameterSpec ivps = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);//运行到这一行时就报上面的异常 byte[] data = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)); // IV不需要保密,把IV和密文一起返回 return DatatypeConverter.printBase64Binary(join(iv, data)); }
奇怪的是只有这个同事的有问题
查找原因
通过谷歌发现根本原因:JDK版本的不同
直接原因:
如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. 因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美国对软件出口的控制,不同的jdk版本又有不同的长度限制
解决
这里建议直接更换JDK,现在较为普遍使用的jdk8版本,事实也证明,jdk8没有遇到这种长度限制
这里给大家提供下jdk8下载版本
MAC版
链接: https://pan.baidu.com/s/1649IuAnx79pmvsTaGIJJAA 提取码: uv38
Linux版
链接: https://pan.baidu.com/s/1IsWdCbv0h0htFpm0M-Gf0Q 提取码: 2f4w
Windows版
链接: https://pan.baidu.com/s/1slN99jqwS0afoJhldoBDYg 提取码: wmbk
如果获取出现问题可私信我发你