InvalidKeyException非法密钥大小

时间:2010-10-05 10:31:15

标签: 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*..)

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

5 个答案:

答案 0 :(得分:122)

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

Java 9及更高版本

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

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

  

JCE司法管辖政策文件默认为无限

     

如果您的应用程序以前需要Java Cryptography   扩展(JCE)无限强度管辖政策文件,然后你   不再需要下载或安装它们。他们被包括在内   JDK并默认激活。

     

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

     

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

     

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

Java 8及更早版本

Java 8 Update 161及更高版本

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

Java 8 Update 151及更高版本

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

crypto.policy=unlimited

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

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

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

在Java 8 Update 151之前

对于Java 8 Update 144及更早版本,您需要安装Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files(可在Oracle下载)。

安装这些文件(来自下载中的README.txt):

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

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

         

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

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

         

    如果你后来决定恢复原来的“强”但是   有限的政策版本,首先制作原始JCE的副本   策略文件(US_export_policy.jar和local_policy.jar)。然后   用无限的力量取代强大的政策文件   在上一步中提取的版本。

         

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

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

请注意JDK,它位于jre / lib / security。

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

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