我有一个测试在我的开发 MacBook Pro 上运行良好,但无法在持续集成 TeamCity 服务器上运行。
错误如下:
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
development box 和 TeamCity 都使用 Java 1.6,我使用 BouncyCastle 库来满足特殊 AES 加密的需要。
代码如下:
private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
Security.addProvider(new BouncyCastleProvider());
SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
return cipher.doFinal(info.getBytes("UTF-8"));
}
更新
看起来根据所选的答案,我必须修改我的 TeamCity 安装中的某些内容,这可能会影响某些用户安装 - 所以这不是一个好的选择,我必须切换到另一个加密库来无限制地执行此操作。所以充气城堡可能会有所帮助。
更新 2
我实际上转而使用 BouncyCastle 来避免此限制。请注意,这仅在您直接使用自己的 BC 类而不是 BC 提供程序时才有效。
原文由 Vladimir 发布,翻译遵循 CC BY-SA 4.0 许可协议
此错误意味着您的 Java 虚拟机使用的策略仅允许受美国出口法律限制的加密密钥大小。
Java 9 及更高版本
Unlimited Strength Jurisdiction Policy Files 包含在 Java 9 中并默认使用(请参阅 Java 9 迁移指南中的安全更新)。
如果您在 Java 9 中遇到此错误,这可能意味着策略配置已更改为更具限制性的策略(
limited
),请参阅迁移指南中的说明:Java 8 及更早版本
Java 8 更新 161 及更高版本
从 Java 8 Update 161 开始,Java 8 默认使用 Unlimited Strength Jurisdiction Policy。如果您收到此错误,可能表示配置已更改为
limited
。请参阅有关 Java 8 Update 151 的下一节或有关 Java 9 的上一节中的说明,将其改回unlimited
。Java 8 更新 151 及更高版本
从 Java 8 Update 151 开始,无限强度管辖策略包含在 Java 8 中,但默认情况下不使用。要启用它,您需要编辑
<java_home>/jre/lib/security
(对于 JDK)或<java_home>/lib/security
(对于 JRE)中的java.security
文件。取消注释(或包含)该行确保使用以管理员身份运行的编辑器编辑文件。
策略更改仅在重新启动 JVM 后生效(这对于像 Tomcat 这样长时间运行的服务器进程尤其重要)。
为了向后兼容,按照下一节中的说明安装策略文件仍然有效。
Java 8 更新之前 151
对于 Java 8 Update 144 及更早版本,您需要安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(可从 Oracle 获得)。
要安装这些文件(从下载中的
README.txt
):对于 JDK,请注意它位于 jre/lib/security 中。
新的策略文件只有在重启 JVM 后才会生效(这对于像 Tomcat 这样长时间运行的服务器进程尤其重要)。