InvalidKeyException非法密钥大小

我有一个testing,运行在我的发展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库来满足特殊的AESencryption需求。

代码如下:

 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安装的东西,它可能会影响一些用户安装 – 所以它不是一个好的select,我不得不切换到另一个encryption库,没有任何限制。 所以可能充气城堡将有所帮助。

更新2

我实际上转而使用BouncyCastle来避免这个限制。 请注意,这只适用于直接使用自己的BC类,而不是BC提供者。

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

Java 8和更早的版本

Java 8 Update 151和更高版本

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

 crypto.policy=unlimited 

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

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

为了实现向后兼容性,安装下一部分所述的策略文件仍然可以。

在Java 8更新151之前

对于Java 8 Update 144及更早版本,您需要安装Javaencryption扩展(JCE)无限强度pipe辖权策略文件(在Oracle上提供 )。

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

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

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

    这将创build一个名为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)。 然后用上一步中提取的无限强度版本replace强策略文件。

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

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

注意JDK是在jre / lib / security。

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

Java 9

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

如果Java 9出现此错误,则可能意味着策略configuration已更改为更严格的策略( limited ),请参阅迁移指南中的说明:

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

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

如果您的国家或用途需要更严格的策略,则有限的Javaencryption策略文件仍可用。

如果您有任何默认提供的策略文件都不符合要求,则可以自定义这些策略文件以满足您的需要。

请参阅<java-home>/conf/security/java.security文件中的crypto.policy Security属性或Java Platform Standard Edition安全开发人员指南中的encryption强度configuration 。

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

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

除了安装策略文件之外,还要确保CUSTOMLONGSECRETKEY...getBytes()的确产生了32字节的数组。 我会使用CUSTOMLONGSECRETKEY.getBytes(some encoding)并从中得到前32个字节。 更好的是,使用全密钥为您的AES所需的大小派生密钥。

确保您知道IDE使用的JAVA_HOMEpath 。 为了复制到正确的path。

在我的情况下,我使用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