Java InvalidKeyException非法密钥大小

Java InvalidKeyException非法密钥大小,java,aes,jce,Java,Aes,Jce,我有一个测试在我的开发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*..) private

我有一个测试在我的开发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*..)
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"));
}
development box和TeamCity都使用Java 1.6,我使用BouncyCastle库来满足特殊AES加密的需要

代码如下:

java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
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提供程序时有效。

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

Java 9及更高版本 Java 9附带了无限强度管辖权策略文件,默认情况下使用这些文件(请参阅)

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

JCE辖区策略文件默认值是无限制的

如果您的应用程序以前需要Java加密 扩展名(JCE)无限强度权限策略文件,然后 不再需要下载或安装它们。它们包括在 默认情况下,JDK和

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

如果您有任何一项政策都无法满足的要求 默认情况下提供的文件,然后您可以自定义这些策略文件 满足你的需要

请参阅中的
crypto.policy
Security属性
/conf/security/java.security
文件,或 在Java平台上, 标准版安全开发人员指南

Java8及更早版本 Java8更新161及更高版本 从Java8更新161开始,Java8默认为无限强度管辖权策略。如果收到此错误,则可能表明配置已更改为
limited
。请参阅Java 8 Update 151下一节或Java 9上一节中的说明,将其更改回
unlimited

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

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

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

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

在Java8更新之前151 对于Java8Update144和更早版本,您需要安装Java加密扩展(JCE)无限强度管辖权策略文件(可在上获得)

要安装这些文件(从下载中的
README.txt
),请执行以下操作:

  • 下载无限强度JCE策略文件

  • 解压缩并解压缩下载的文件

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

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

    如果您以后决定恢复到原来的“强”,但 有限的策略版本,首先复制原始JCE 策略文件(US_export_policy.jar和local_policy.jar)。然后 用无限强度替换强策略文件 在上一步中提取的版本

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

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    
    /lib/security[Unix]
    \lib\security[Windows]
    
  • 注意,对于JDK,它位于jre/lib/security中


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

    除了安装策略文件外,还要确保
    CUSTOMLONGSECRETKEY…getBytes()
    确实生成32字节数组。我将使用
    CUSTOMLONGSECRETKEY.getBytes(一些编码)
    并从中获取前32个字节。更好的是,使用完整的密钥为AES派生您需要的大小的密钥。

    我有一个类似的问题,但在我的例子中,有一个路径错误


    JAVA_主页是jdk1.6.0_18,因此我将这两个JAR放入
    jdk1.6.0_18/lib/security
    ,但在jdk1.6.0_18中是
    jre
    目录。这两个文件都应该放在
    jdk1.6.0_18/jre/lib/security
    中,确保您知道IDE使用的JAVA主页路径。 以便复制到正确的路径

    就我而言,我使用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

    对于JDK1.8.0,我也面临同样的问题-

    对于这个及以上版本,您不需要下载与安全相关的jar文件,因为这些版本中的路径下已经包含了local_policy.jar和US_export_policy.jar- \jre\lib\security\policy(JAVA\u HOME指当前的JAVA安装文件夹) 您只需要在java.security文件中进行更改,该文件位于/jre/lib/security中- 取消对该行的注释- 加密策略=无限制