关于java:InvalidKeyException非法密钥大小

InvalidKeyException Illegal key size

我有一个测试在我的开发MacBookPro上运行得很好,但是在持续集成TeamCity服务器上运行失败。

错误如下:

1
2
3
4
java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

开发盒和TeavCype使用Java 1.6和I使用BooCyCARS库以满足特殊AES加密的需要。

代码如下:

1
2
3
4
5
6
7
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迁移指南中的安全更新)。

如果使用Java 9获得此错误,则可能意味着策略配置已被更改为更具限制性的策略(EDCOX1×0),请参见迁移指南中的说明:

JCE Jurisdiction Policy File Default is Unlimited

If your application previously required the Java Cryptography
Extension (JCE) Unlimited Strength Jurisdiction Policy Files, then you
no longer need to download or install them. They are included in the
JDK and are activated by default.

If your country or usage requires a more restrictive policy, the
limited Java cryptographic policy files are still available.

If you have requirements that are not met by either of the policy
files provided by default, then you can customize these policy files
to meet your needs.

See the crypto.policy Security property in the
/conf/security/java.security file, or
Cryptographic Strength Configuration in the Java Platform,
Standard Edition Security Developer's Guide.

号Java 8及其更早Java 8更新161及更高版本

从Java 8更新161开始,Java 8默认为无限强度管辖权策略。如果收到此错误,则可能表明配置已更改为limited。参见Java 8更新151或Java 9上一节的下一节中的说明,将其更改为EDCOX1 2。

Java 8更新151及更高版本

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

1
crypto.policy=unlimited

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

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

为了向后兼容,安装下一节中记录的策略文件仍然可以工作。

在Java 8更新之前151

对于Java 8更新144和更早,您需要安装Java加密扩展(JCE)无限强度管辖权策略文件(在Oracle中可用)。

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

  • Download the unlimited strength JCE policy files.

  • Uncompress and extract the downloaded file.

    This will create a subdirectory called jce.
    This directory contains the following files:

    1
    2
    3
    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
  • Install the unlimited strength policy JAR files.

    In case you later decide to revert to the original"strong" but
    limited policy versions, first make a copy of the original JCE
    policy files (US_export_policy.jar and local_policy.jar). Then
    replace the strong policy files with the unlimited strength
    versions extracted in the previous step.

    The standard place for JCE jurisdiction policy JAR files is:

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

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


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

    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的密钥。


    对于JDK 1.8.0,我也面临同样的问题151-

    对于这个及以上版本,您不需要下载与安全性相关的JAR文件。因为本地的policy.jar和us export policy.jar已经包含在路径下的这些版本中。-jRLIB安全性策略(javajHoad是指当前的Java安装文件夹)您只需要在java.security文件中进行更改,该文件位于/jre/lib/security中。-取消对行的注释-crypto.policy=无限制


    确保您知道您的IDE使用的Java_主页的路径。以便复制到正确的路径。

    在我的例子中,我使用Intellij:库

    而不是当我在控制台中显示$java_主页时。/用户/ MySux/SDKMAN/Prase/Java/Neal/JRe/LIB /安全性