• Java 开发者必备:一文解决 AES 加密中的“非法密钥大小”异常


    彻底告别 java.security.InvalidKeyException,轻松应对不同 JDK 版本

    引言

      在 Java 开发过程中,我们经常会遇到各种各样的安全相关的问题。其中一个常见的问题是当使用 Java 的加密功能时遇到的 “Illegal key size or default parameters” 错误。本文将详细介绍如何解决这一问题,包括问题的背景、原因分析、解决方案以及实践步骤。

    问题背景

       从Java 1.4引入JCE(Java Cryptography Extension)起,为了遵守美国出口管制法律,Oracle对默认JRE中的加密算法设置了限制,其中AES算法的最大密钥长度被限制在128位。这意味着如果您尝试使用192位或256位的AES密钥,上述异常就会发生。

    此限制影响了从Java 1.4至包括但不限于Java 8在内的多个版本。尽管Java 11及之后的版本中JCE的概念已被淡化,不再作为单独的扩展提供,但密钥长度限制依旧存在,只是后来优化了,默认支持更长的密钥。

      例如,对于 AES 加密算法,默认只允许使用 128 位的密钥长度。这可能会导致在实际开发过程中遇到 java.security.InvalidKeyException: Illegal key size or default parameters 的异常。

    问题影响版本

      此问题最早出现在 Java 6 和 Java 7 中,因为这些版本默认对密钥大小进行了严格的限制,使用大于 128 位的密钥长度时也将会触发此异常。从 JDK 8 Update 131 开始,这个问题已经被默认解决了,即默认支持更大的密钥大小。

      注意事项

      JDK 8 Update 131 及之后的版本默认包含了无限制的 JCE 策略文件。应当是不会出现上述问题的。

      确保在安装无限制策略文件前了解相关的安全和合规要求,特别是在受监管的环境中。

      如果您使用的是 OpenJDK 或其他非 Oracle JDK 发行版,可能需要手动安装这些策略文件,即使您的 JDK 版本高于 JDK 8 Update 131。没尝试,此问题可自行验证

    错误日志示例

    假设你在使用 AES 加密时遇到了此问题,错误日志可能如下所示:

    复制代码
    1 java.security.InvalidKeyException: Illegal key size or default parameters
    2     at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
    3     at javax.crypto.Cipher.implInit(Cipher.java:801)
    4     at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    5     at javax.crypto.Cipher.init(Cipher.java:1249)
    6     at javax.crypto.Cipher.init(Cipher.java:1186)
    7     at com.ulic.claimService.util.Demo.aesEncrypt(Demo.java:204)
    8     at com.ulic.claimService.util.Demo.main(Demo.java:57)
    复制代码

    解决方案

      要解决这个问题,需要下载并安装 Java Cryptography Extension (JCE) 无限制强度管辖策略文件。下面是详细的步骤:

    确定你的 Java 版本:

      打开命令行工具,运行 java -version 命令来确认你正在使用的 Java 版本。

    下载 JCE 无限制强度管辖策略文件:

      访问 Oracle 官方网站下载适用于你的 Java 版本的 JCE 文件。

      对于 Java 8,你可以访问 这里 下载。

      对于 Java 11 或更高版本,,默认已支持无限制的密钥长度,无需下载配置相应的 JCE 无限制策略文件。

    替换现有的策略文件:

      找到你的 Java 安装目录下的 lib/security 文件夹。路径通常是 %JAVA_HOME%\jre\lib\security(Windows) $JAVA_HOME/jre/lib/security(Linux/Mac)。
      在该目录中,你会看到两个文件:local_policy.jarUS_export_policy.jar。
      使用从 Oracle 下载的相应文件替换这两个文件。(注意备份原文件)

    重新启动应用程序:

      替换文件后,确保重启你的应用程序以应用新的策略文件。

      再次运行你的程序,看看异常是否已经消失。

     

     

  • 相关阅读:
    1535_TriCore编译器Tasking使用_汇编分区、内置函数以及伪指令
    【Java】解决Java报错:ConcurrentModificationException
    腾讯智能表格文档如何做进度管理
    Spring boot 随笔 1 DatasourceInitializer
    【无人机】基于自适应无人机的湍流下发动机故障不确定性自动着陆问题(Matlab代码实现)
    Unity Editor 打包指定资源(AssetBundle)和加载指定资源
    4、【创业必备企业架构,可开发任意项目】SpringCloud大型企业分布式微服务云架构源码之MySQL 连接
    [PAT练级笔记] 34 Basic Level 1034 有理数四则运算
    ES 客户端 RestHighLevelClient Connection reset by peer 亲测有效 2022-11-05
    C++——智能指针
  • 原文地址:https://www.cnblogs.com/xsge/p/18363327