InvalidKeyException非法密钥大小

问题描述 投票:56回答:5

我有一个在我的开发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"));
}

UPDATE

看起来根据所选答案,我必须在我的TeamCity安装上修改一些东西,它可能会影响一些用户安装 - 所以它不是一个好选择我必须切换到另一个加密库来做到这一点没有限制。所以充满弹性的城堡可能会有所帮助。

更新2

我实际上切换到使用BouncyCastle来避免这种限制。请注意,这仅适用于直接使用自己的BC类,而不是BC提供程序。

java aes jce
5个回答
123
投票

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

Java 9及更高版本

无限强度管辖权政策文件包含在Java 9中并默认使用(请参阅Security Updates in the Java 9 Migration Guide)。

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

JCE管辖权政策文件默认为无限制

如果您的应用程序以前需要Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files,那么您不再需要下载或安装它们。它们包含在JDK中,默认情况下处于激活状态。

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

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

请参阅crypto.policy文件中的<java-home>/conf/security/java.security Security属性,或Java平台标准版安全开发人员指南中的Cryptographic Strength Configuration

Java 8及更早版本

Java 8 Update 161 and higher

从Java 8 Update 161开始,Java 8默认为Unlimited Strength Jurisdiction Policy。如果收到此错误,则表明配置已更改为limited。有关将其更改回unlimited的信息,请参阅Java 8 Update 151下一节中的说明或Java 9的上一节。

Java 8 Update 151 and higher

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

crypto.policy=unlimited

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

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

为了向后兼容,安装策略文件(如下一节中所述)仍然可以正常工作。

Before Java 8 Update 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
  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)尤其重要)。


8
投票

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

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


1
投票

除了安装策略文件之外,还要确保CUSTOMLONGSECRETKEY...getBytes()确实生成32字节数组。我会使用CUSTOMLONGSECRETKEY.getBytes(some encoding)并获得前32个字节。更好的是,使用整个密钥来获得具有所需大小的AES密钥。


0
投票

确保您知道IDE使用的JAVA_HOME路径。为了复制到正确的路径。

就我而言,我使用IntelliJ:/ Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

而不是当我在控制台中显示$ JAVA_HOME时。 /Users/myuser/.sdkman/candidates/java/current/jre/lib/security


0
投票

我在jdk 1.8.0_151-面临同样的问题

对于此版本及以上版本,您无需下载与security相关的jar文件。因为,local_policy.jar和US_export_policy.jar已包含在path- \ jre \ lib \ security \ policy下的这些版本中(JAVA_HOME指的是你当前的java安装文件夹)你需要做的唯一的chng是java.security文件,该文件存在于/ jre / lib / security中 - 取消注释该行 - crypto.policy = unlimited

© www.soinside.com 2019 - 2024. All rights reserved.