加密报错:java.security.InvalidKeyException: Illegal key size

本文详细记录了在不同JDK版本下进行加密操作时遇到的`java.security.InvalidKeyException: Illegal key size`问题。问题源于JDK的安全策略限制,特别是对于加密密钥长度的限制。解决方案是下载并替换JRE或JDK的`local_policy.jar`和`US_export_policy.jar`文件,以解除限制。作者提供了各个JDK版本的无限制策略文件下载链接,并提醒用户覆盖原有文件前做好备份。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

今天调试售票系统的加密,发现加密解密再JDK10下面是ok的,再JDK8下面就GG了,搞了半天,后来发现,原来另有原因,是个坑。

Exception in thread "main" java.security.InvalidKeyException: Illegal key size
	at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
	at javax.crypto.Cipher.implInit(Cipher.java:805)
	at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
	at javax.crypto.Cipher.init(Cipher.java:1396)
	at javax.crypto.Cipher.init(Cipher.java:1327)
	at com.software.dev.util.MainEntrance.Encrypt(MainEntrance.java:83)
	at com.software.dev.util.MainEntrance.main(MainEntrance.java:23)

听说,在使用JCE加密时 java.security.InvalidKeyException:illegal Key Size 这个报错是因为用到了jdk sercurity, 而jdk sercurity 使用的jar包 $JAVA_HOME/jre/lib/security/local_policy.jar$JAVA_HOME/jre/lib/security/US_export_policy.jar 中有对技术出口的限制,限制了加密只有128bit,而没有限制的则有256bit。

解决方案

贸易战争是无情的,但Oracle还是假装很贴心的再官网给我们提供了解决方案:

JDK6密码扩展无限制权限策略文件
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

JDK7密码扩展无限制权限策略文件
https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

JDK8密码扩展无限制权限策略文件
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

在这里插入图片描述

下载后,覆盖到 $JAVA_HOME/jre/lib/security 中去,主要是local_policy.jar和 US_export_policy.jar中

在这里插入图片描述

  • 如果处理的是JRE,将两个jar文件放到 %JRE_HOME%\lib\security 下覆盖原来文件即可(最好先备份)。
  • 如果处理的是JDK,将两个jar文件也放到 %JDK_HOME%\jre\lib\security 下覆盖原来文件即可(最好先备份)
    最后,别忘了验证是否成功,如果没报错就ok了
    Process finished with exit code 0
    ————————————————
    版权声明:本文为CSDN博主「Moshow郑锴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/moshowgame/article/details/85234286
### Java 微信提现报错 `java.lang.IllegalArgumentException` 密钥长度限制解决方案 在 Java 开发中,当使用加密算法时,如果密钥长度超过默认限制(例如 AES 的 128 位),可能会抛出 `java.security.InvalidKeyException: Illegal key size` 异常。这是由于 Java 默认的加密策略文件仅支持有限的密钥长度,而未启用无限强度的加密策略[^1]。 #### 问题分析 微信账户提现过程中可能涉及敏感数据的加密和解密操作(如用户信息、金额等)。如果使用的密钥长度大于默认限制(如 256 位 AES 密钥),则会触发上述异常。此问题的根本原因在于 Java 运行时环境读取的是受限的 `policy` 文件,导致无法支持更大的密钥长度。 #### 解决方案 以下是解决密钥长度限制问题的步骤: 1. **升级 JDK 版本** 从 JDK 8u161 和 JDK 9 开始,Oracle 已经默认启用了无限强度的加密支持。因此,如果可能,请将 JDK 升级到较新的版本以避免手动配置 `policy` 文件[^1]。 2. **安装 Unlimited Strength Jurisdiction Policy Files** 如果无法升级 JDK,则需要手动安装无限强度的加密策略文件。具体步骤如下: - 下载适用于当前 JDK 版本的 `Unlimited Strength Jurisdiction Policy Files`。 - 将下载的 `local_policy.jar` 和 `US_export_policy.jar` 替换到 `${java_home}/jre/lib/security` 目录下的同名文件[^1]。 3. **检查 JCE 配置** 确保 Java Cryptography Extension (JCE) 已正确配置。可以通过以下代码验证是否支持无限强度加密: ```java import javax.crypto.Cipher; public class CheckJCE { public static void main(String[] args) { int maxKeyLength = Cipher.getMaxAllowedKeyLength("AES"); System.out.println("Max allowed AES key length: " + maxKeyLength); } } ``` 如果输出结果为 `2147483647`,表示已启用无限强度加密;否则,仍受限制[^1]。 4. **调整密钥长度** 如果无法修改 JCE 配置,可以尝试将密钥长度调整为 128 位以符合默认限制。例如,在生成 AES 密钥时指定长度: ```java import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class GenerateAESKey { public static SecretKey generateKey(int n) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(n); // 指定密钥长度为 128 或 256 return keyGenerator.generateKey(); } } ``` 5. **处理异常** 在代码中捕获并处理 `InvalidKeyException` 异常,确保程序能够优雅地应对错误场景。例如: ```java try { // 加密或解密逻辑 } catch (IllegalArgumentException e) { if (e.getCause() instanceof InvalidKeyException) { System.err.println("密钥长度不合法,请检查 JCE 配置或密钥生成逻辑。"); } else { throw e; // 转发其他异常 } } ``` #### 示例代码 以下是一个完整的示例,展示如何生成 AES 密钥并验证其长度是否符合要求: ```java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.InvalidKeyException; public class AESKeyTest { public static void main(String[] args) { try { SecretKey secretKey = generateAESKey(256); // 生成 256 位 AES 密钥 System.out.println("Generated AES key successfully."); // 测试加密操作 Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); System.out.println("Encryption test passed."); } catch (Exception e) { if (e.getCause() instanceof InvalidKeyException) { System.err.println("密钥长度不合法,请检查 JCE 配置或密钥生成逻辑。"); } else { e.printStackTrace(); } } } public static SecretKey generateAESKey(int keySize) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(keySize); // 指定密钥长度 return keyGenerator.generateKey(); } } ``` #### 注意事项 - 确保所有相关方(如支付平台)使用的密钥长度一致,避免因不匹配导致的加密/解密失败。 - 在生产环境中,建议使用安全的方式存储和传输密钥,避免泄露风险。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值