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
file, or /conf/security/java.security
Cryptographic Strength Configuration in the Java Platform,
Standard Edition Security Developer's Guide.
号Java 8及其更早Java 8更新161及更高版本
从Java 8更新161开始,Java 8默认为无限强度管辖权策略。如果收到此错误,则可能表明配置已更改为
从Java 8更新151开始,无限的权限管辖策略包含在Java 8中,但默认情况下不使用。要启用它,您需要在
1 | crypto.policy=unlimited |
确保使用以管理员身份运行的编辑器编辑文件。
策略更改仅在重新启动JVM后生效(这对于像Tomcat这样的长时间运行的服务器进程尤其重要)。
为了向后兼容,安装下一节中记录的策略文件仍然可以工作。
在Java 8更新之前151对于Java 8更新144和更早,您需要安装Java加密扩展(JCE)无限强度管辖权策略文件(在Oracle中可用)。
要安装这些文件(从下载的
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 fileInstall 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放在
除了安装策略文件外,还要确保
对于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 /安全性