InvalidKeyException非法密钥大小

Vla*_*mir 57 java jce aes

我有一个在我的开发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*..)
Run Code Online (Sandbox Code Playgroud)

开发盒和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"));
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

更新2

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

Mar*_*eel 123

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

Java 9及更高版本

无限强度管辖权策略文件包含在Java 9中并默认使用(请参阅"Java 9迁移指南"中的安全更新).

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

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

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

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

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

请参阅文件中的crypto.policySecurity属性 <java-home>/conf/security/java.security,或 Java平台标准版安全开发人员指南中的加密强度配置.

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的文件<java_home>/jre/lib/security(用于JDK)或<java_home>/lib/security(对于JRE).取消注释(或包括)该行

crypto.policy=unlimited
Run Code Online (Sandbox Code Playgroud)

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

策略更改仅在重新启动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. 解压缩并解压缩下载的文件.

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

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装无限强度策略JAR文件.

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

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

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    
    Run Code Online (Sandbox Code Playgroud)

注意JDK它在jre/lib/security中.

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

  • 请注意,在安装新策略文件之后,您可能需要**重新启动通过JVM运行的任何内容.**例如,在我的Web应用程序选择更改之前,我必须重新启动Tomcat. (4认同)

小智 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.