Java InvalidKeyException非法密钥大小
我有一个测试在我的开发MacBook Pro上运行得很好,但在持续集成TeamCity服务器上运行失败 错误如下:Java InvalidKeyException非法密钥大小,java,aes,jce,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*..) private
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
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"));
}
development box和TeamCity都使用Java 1.6,我使用BouncyCastle库来满足特殊AES加密的需要
代码如下:
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
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出现此错误,可能意味着策略配置已更改为限制性更强的策略(
limited
),请参阅《迁移指南》中的说明:
JCE辖区策略文件默认值是无限制的
如果您的应用程序以前需要Java加密
扩展名(JCE)无限强度权限策略文件,然后
不再需要下载或安装它们。它们包括在
默认情况下,JDK和
如果您的国家/地区或使用需要更严格的政策
有限的Java加密策略文件仍然可用
如果您有任何一项政策都无法满足的要求
默认情况下提供的文件,然后您可以自定义这些策略文件
满足你的需要
请参阅中的crypto.policy
Security属性
/conf/security/java.security
文件,或
在Java平台上,
标准版安全开发人员指南
Java8及更早版本
Java8更新161及更高版本
从Java8更新161开始,Java8默认为无限强度管辖权策略。如果收到此错误,则可能表明配置已更改为limited
。请参阅Java 8 Update 151下一节或Java 9上一节中的说明,将其更改回unlimited
Java8更新151及更高版本
从Java 8 Update 151开始,Java 8中包含无限强度管辖权策略,但默认情况下不使用。要启用它,您需要编辑/jre/lib/security
(对于JDK)或/lib/security
(对于jre)中的java.security
文件。取消注释(或包括)行
确保使用以管理员身份运行的编辑器编辑文件
策略更改仅在重新启动JVM后生效(这对于像Tomcat这样的长时间运行的服务器进程尤其重要)
为了向后兼容,安装下一节中介绍的策略文件仍然可以
在Java8更新之前151
对于Java8Update144和更早版本,您需要安装Java加密扩展(JCE)无限强度管辖权策略文件(可在上获得)
要安装这些文件(从下载中的README.txt
),请执行以下操作:
README.txt This file
local_policy.jar Unlimited strength local policy file
US_export_policy.jar Unlimited strength US export policy file
<java-home>/lib/security [Unix]
<java-home>\lib\security [Windows]
/lib/security[Unix]
\lib\security[Windows]
新的策略文件仅在重新启动JVM后生效(这对于像Tomcat这样的长时间运行的服务器进程尤其重要)。除了安装策略文件外,还要确保
CUSTOMLONGSECRETKEY…getBytes()
确实生成32字节数组。我将使用CUSTOMLONGSECRETKEY.getBytes(一些编码)
并从中获取前32个字节。更好的是,使用完整的密钥为AES派生您需要的大小的密钥。我有一个类似的问题,但在我的例子中,有一个路径错误
JAVA_主页是jdk1.6.0_18,因此我将这两个JAR放入
jdk1.6.0_18/lib/security
,但在jdk1.6.0_18中是jre
目录。这两个文件都应该放在jdk1.6.0_18/jre/lib/security
中,确保您知道IDE使用的JAVA主页路径。
以便复制到正确的路径
就我而言,我使用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对于JDK1.8.0,我也面临同样的问题- 对于这个及以上版本,您不需要下载与安全相关的jar文件,因为这些版本中的路径下已经包含了local_policy.jar和US_export_policy.jar- \jre\lib\security\policy(JAVA\u HOME指当前的JAVA安装文件夹) 您只需要在java.security文件中进行更改,该文件位于/jre/lib/security中- 取消对该行的注释- 加密策略=无限制