无效密钥异常 密钥大小非法

2022-08-31 15:33:39

我有一个测试,在我的开发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*..)

开发盒和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 提供程序的情况。


答案 1

此错误意味着您的 Java 虚拟机使用的策略仅允许由于美国出口法律而限制加密密钥大小。

Java 9 及更高版本

无限制强度管辖权策略文件包含在 Java 9 中,默认情况下使用(请参见《Java 9 迁移指南》中的安全更新)。

如果您在 Java 9 中遇到此错误,则可能意味着策略配置已更改为限制性更强的策略 (),请参阅迁移指南中的说明:limited

JCE 管辖区策略文件默认值为无限制

如果您的应用程序以前需要 Java 加密扩展 (JCE) 无限强度管辖权策略文件,则不再需要下载或安装它们。它们包含在 JDK 中,默认情况下处于激活状态。

如果您所在的国家/地区或使用需要更严格的策略,则有限的 Java 加密策略文件仍然可用。

如果默认情况下提供的任何一个策略文件都不满足您的要求,则可以自定义这些策略文件以满足您的需求。

请参阅文件中的“安全性”属性,或参阅 Java 平台中的加密强度配置,标准版安全性开发人员指南。crypto.policy<java-home>/conf/security/java.security

Java 8 及更早版本

Java 8 Update 161 及更高版本

从 Java 8 Update 161 开始,Java 8 默认为“无限强度管辖权策略”。如果收到此错误,则可能表示配置已更改为 。有关将其更改回 Java 8 Update 151 的说明,请参阅下一节中有关 Java 8 Update 151 的说明,或有关 Java 9 的上一节中的说明。limitedunlimited

Java 8 Update 151 及更高版本

从 Java 8 Update 151 开始,无限强度管辖权策略包含在 Java 8 中,但默认情况下不使用。要启用它,您需要在(对于JDK)或(对于JRE)中编辑文件。取消注释(或包括)行java.security<java_home>/jre/lib/security<java_home>/lib/security

crypto.policy=unlimited

确保使用以管理员身份运行的编辑器编辑文件。

策略更改仅在重新启动 JVM 后生效(这对于长时间运行的服务器进程(如 Tomcat)尤其重要)。

为了向后兼容,安装下一节中介绍的策略文件仍然有效。

在 Java 8 更新 151 之前

对于 Java 8 Update 144 及更早版本,您需要安装 Java 加密扩展 (JCE) 无限强度管辖权策略文件(可在 Oracle 上找到)。

要安装这些文件(从下载中):README.txt

  1. 下载无限强度 JCE 策略文件。

  2. 解压缩并解压缩下载的文件。

    这将创建一个名为 jce 的子目录。此目录包含以下文件:

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
  3. 安装无限强度策略 JAR 文件。

    如果您以后决定恢复到原始的“强”但有限的策略版本,请先创建原始 JCE 策略文件的副本(US_export_policy.jar并local_policy.jar)。然后将强策略文件替换为上一步中提取的无限强度版本。

    JCE 管辖区策略 JAR 文件的标准位置是:

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    

注意,对于JDK,它是在jre/lib/security中。

新策略文件仅在重新启动 JVM 后生效(这对于长时间运行的服务器进程(如 Tomcat)尤其重要)。


答案 2

我遇到了类似的问题,但在我的情况下,有一个路径错误。

JAVA_HOME jdk1.6.0_18,所以我把两个罐子放进了,但jdk1.6.0_18是目录。两个文件都应已放入 。jdk1.6.0_18/lib/securityjrejdk1.6.0_18/jre/lib/security


推荐