InvalidKeyException 非法密钥大小

新手上路,请多包涵

我有一个测试在我的开发 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 许可协议

阅读 645
2 个回答

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

Java 9 及更高版本

Unlimited Strength Jurisdiction Policy Files 包含在 Java 9 中并默认使用(请参阅 Java 9 迁移指南中的安全更新)。

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

JCE 权限策略文件默认为无限制

如果您的应用程序以前需要 Java 密码术扩展 (JCE) 无限强度管辖策略文件,那么您不再需要下载或安装它们。它们包含在 JDK 中并默认激活。

如果您的国家或用途需要更严格的政策,有限的 Java 加密政策文件仍然可用。

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

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

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 文件。取消注释(或包含)该行

crypto.policy=unlimited

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

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

为了向后兼容,按照下一节中的说明安装策略文件仍然有效。

Java 8 更新之前 151

对于 Java 8 Update 144 及更早版本,您需要安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(可从 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

  1. 安装无限强度策略 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 这样长时间运行的服务器进程尤其重要)。

原文由 Mark Rotteveel 发布,翻译遵循 CC BY-SA 3.0 许可协议

我遇到了类似的问题,但就我而言,存在路径错误。

JAVA_HOME 是 jdk1.6.0_18,所以我将这两个 jar 放入 jdk1.6.0_18/lib/security ,但在 jdk1.6.0_18 中是 jre 目录。这两个文件都应该放在 jdk1.6.0_18/jre/lib/security 中。

原文由 oopexpert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题