InvalidKeyException非法密钥大小
我有一个testing,运行在我的发展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库来满足特殊的AESencryption需求。
代码如下:
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")); }
UPDATE
看起来像根据选定的答案,我必须修改我的TeamCity安装的东西,它可能会影响一些用户安装 – 所以它不是一个好的select,我不得不切换到另一个encryption库,没有任何限制。 所以可能充气城堡将有所帮助。
更新2
我实际上转而使用BouncyCastle来避免这个限制。 请注意,这只适用于直接使用自己的BC类,而不是BC提供者。
此错误意味着您的Java虚拟机使用的策略只允许受美国出口法规限制的encryption密钥大小。
Java 8和更早的版本
Java 8 Update 151和更高版本
从Java 8 Update 151开始,无限强度pipe辖权策略包含在Java 8中,但默认情况下不会使用。 要启用它,您需要编辑<java_home>/jre/lib/security
(用于JDK)或<java_home>/lib/security
(用于JRE)中的java.security
文件。 取消注释(或包含)该行
crypto.policy=unlimited
确保使用以pipe理员身份运行的编辑器编辑文件。
策略更改仅在重新启动JVM后才生效(对于像Tomcat这样的长时间运行的服务器进程,这一点尤为重要)。
为了实现向后兼容性,安装下一部分所述的策略文件仍然可以。
在Java 8更新151之前
对于Java 8 Update 144及更早版本,您需要安装Javaencryption扩展(JCE)无限强度pipe辖权策略文件(在Oracle上提供 )。
要安装这些文件(从下载中的README.txt
):
下载无限强度的JCE策略文件。
解压缩并解压下载的文件。
这将创build一个名为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)。 然后用上一步中提取的无限强度版本replace强策略文件。
JCEpipe辖策略JAR文件的标准位置是:
<java-home>/lib/security [Unix] <java-home>\lib\security [Windows]
注意JDK是在jre / lib / security。
新的策略文件只有在重新启动JVM后才会生效(这对于像Tomcat这样的长时间运行的服务器进程尤为重要)。
Java 9
无限强度pipe辖权限策略文件包含在Java 9中,默认情况下使用(请参阅Java 9迁移指南中的安全更新 )。
如果Java 9出现此错误,则可能意味着策略configuration已更改为更严格的策略( limited
),请参阅迁移指南中的说明:
JCE辖区政策文件默认为无限制
如果您的应用程序以前需要Javaencryption扩展(JCE)无限强度pipe辖权策略文件,则不再需要下载或安装它们。 它们包含在JDK中,并默认激活。
如果您的国家或用途需要更严格的策略,则有限的Javaencryption策略文件仍可用。
如果您有任何默认提供的策略文件都不符合要求,则可以自定义这些策略文件以满足您的需要。
请参阅
<java-home>/conf/security/java.security
文件中的crypto.policy
Security属性或Java Platform Standard Edition安全开发人员指南中的encryption强度configuration 。
我有一个类似的问题,但在我的情况下,有一个path错误。
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所需的大小派生密钥。
确保您知道IDE使用的JAVA_HOMEpath 。 为了复制到正确的path。
在我的情况下,我使用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
- 在C#中使用AESencryption
- AES与Blowfish进行文件encryption
- 如何使用Python / PyCrypto以OpenSSL兼容的方式对文件进行AESencryption/解密?
- 对iPhone上的NSString进行AESencryption
- 用Node.js和MongoDB存储密码
- 尝试使用AESencryption和解密string时发生IllegalBlockSizeException
- 比较DES,三重DES,AES,blowfishencryption的数据
- 如何selectAESencryption模式(CBC ECB CTRB OCB CFB)?
- 用AESencryption/解密