当前位置: 首页 > 面试题库 >

Java InvalidKeyException非法密钥大小

张俊茂
2023-03-14
问题内容

我的测试可以在开发的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提供程序的情况下有效。


问题答案:

此错误意味着你的Java虚拟机使用的策略仅允许由于美国出口法律限制密码密钥的大小。

Java 9及更高版本

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

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

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

如果你的应用程序以前需要Java密码学扩展(JCE)无限强度管辖权策略文件,那么你不再需要下载或安装它们。它们包含在JDK中,并且默认情况下处于激活状态。

如果你所在的国家/地区或使用情况需要更严格的政策,那么有限的Java加密政策文件仍然可用。

如果你有默认提供的两个策略文件都不满足的要求,则可以自定义这些策略文件以满足你的需求。

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

Java 8及更早版本

Java 8 Update 161及更高版本
从Java 8 Update 161开始,Java 8默认为“无限强度管辖权策略”。如果收到此错误,则可能表明配置已更改为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

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

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

为了向后兼容,下一部分中所述的安装策略文件仍然可以正常工作。

Java 8更新151之前

对于Java 8 Update 144和更早版本,你需要安装Java密码学扩展(JCE)无限强度管辖权策略文件(可从Oracle获得)。

要安装这些文件(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]

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

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



 类似资料:
  • 也许你能帮我。非常感谢!

  • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern

  • 我正在尝试使用Nimbus JOSE+JWT从我的私钥解密JWE数据。 有人能帮我解决这个问题吗。我使用的是Java1.8 我的私钥 我的JWE数据

  • 问题内容: 我遇到以下错误,并且有点卡住:线程“ main”中的异常 我被困住了,因为我找到的所有答案都涉及通常包含在android SDK中的Java 密码扩展(JCE) 。所以我认为我的问题不是这个。 我一定忘记了一些东西,但是我找不到。也许我的代码是错误的(这是我使用Java进行加密的第一种方法,我不是专家,下面的代码大部分是教程的复制粘贴)。 我使用以下代码对String进行加密和解密:

  • 我正在尝试使用“AES/GCM/Nopadding”加密一个简单的测试“Sometext”。 我有一个main方法,首先传递一个字符串作为参数,该参数应该被加密。加密的文本将出现在控制台上。然后,调用解密(通过传递加密文本)来检查解密是否正常,即解密后是否返回相同的文本。我正在调用主类,但它在我的自定义方法中失败,出现异常: 我不确定为什么这个非法密钥大小给出错误。我的密钥“secretkey”在

  • 问题内容: 我使用AES 256密钥加密字节时遇到问题。我已经安装了该策略。这是我所做的: 下载文件:http : //www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html 我将文件local_policy和US_export_policy移至目录/Library/Java/JavaVirtualMa