0%

Illegal key size

解决 Java 中的 Illegal key size 异常

当使用 Cipher.init() 方法时遇到 java.security.InvalidKeyException: Illegal key size 异常,通常是由于 Java 加密扩展(JCE)的默认策略限制了加密算法的密钥长度。

1
2
3
4
5
6
7

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)

以下是详细的解决方案和背景说明:

异常原因

Java 安装时默认包含的 JCE 权限策略文件local_policy.jarUS_export_policy.jar)受限于加密出口管制,对部分加密算法的密钥长度做了限制(如 AES 密钥默认最大支持 128 位)。当使用更长的密钥(如 192 位、256 位)时,就会触发此异常。

解决方案

针对 JDK 7 / JDK 8(低于 8u161 版本)

需要手动替换 JCE 无限制权限策略文件:

  • 步骤 1:下载无限制策略文件
    根据 JDK 版本下载对应文件:
  • 步骤 2:替换策略文件
    1. 解压下载的压缩包,得到 local_policy.jarUS_export_policy.jar
    2. 找到 JDK 安装目录下的安全策略文件夹:
      • 路径:${JAVA_HOME}/jre/lib/security(注意区分 JDK 和 JRE 目录,需替换 JDK 内置 JRE 的文件)。
    3. 备份原有文件(可选),将下载的两个 JAR 文件复制到该目录,覆盖原有文件。
  • 步骤 3:重启应用
    替换后需重启 Java 应用,新策略才能生效。

针对 JDK 8u161 及以上版本(包括 JDK 9+)

无需手动替换文件!从 JDK 8u161 开始,Oracle 已默认启用 无限制加密策略,只需通过以下方式确认配置:

  • 检查 JRE 安全配置文件:
    路径:${JAVA_HOME}/jre/lib/security/java.security
    确保包含以下配置(默认已开启):

    1
    crypto.policy=unlimited
  • 若未开启,手动添加上述配置并重启应用即可。

验证解决方案

可通过以下代码验证密钥长度限制是否解除:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;

public class CryptoTest {
public static void main(String[] args) throws Exception {
// 测试 256 位 AES 密钥
byte[] key = new byte[32]; // 32字节 = 256位
Key secretKey = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 若不抛异常,说明配置成功
System.out.println("密钥长度限制已解除");
}
}
  • 若运行不抛异常,说明无限制策略生效;
  • 若仍抛异常,检查 JDK 版本是否正确、文件是否替换到正确目录。

注意事项

  1. 多 JDK 环境:确保应用使用的 JDK 是已替换策略文件的版本(通过 echo $JAVA_HOMEjava -version 确认)。
  2. OpenJDK 兼容性:部分 OpenJDK 发行版(如 AdoptOpenJDK)默认已解除限制,无需额外配置。
  3. 法律合规:使用无限制加密策略需遵守当地法律法规,确保符合加密算法出口和使用规定

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10