彻底告别 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 下载的相应文件替换这两个文件。(注意备份原文件)

重新启动应用程序:

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

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

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

  1. Java开发者必备的10大学习网站,送给入门学习java的你,请收下!

    作为开发者来说,必备的除了对编码的热情还要有自己的一套技巧,另外不可缺少的就是平时学习的网站.以下本人收集的 Java 开发者必备的网站,这些网站可以提供信息.以及一些很棒的讲座 , 还能解答一般问题 ...

  2. Java开发者必备十大学习网站

    作为开发者来说,必备的除了对编码的热情还要有自己的一套技巧,另外不可缺少的就是平时学习的网站.以下本人收集的Java开发者必备的网站,这些网站可以提供信息,以及一些很棒的讲座, 还能解答一般问题.面试 ...

  3. 国内 Java 开发者必备的两个装备,你配置上了么?

    虽然目前越来越多的国产优秀技术产品走出了国门,但是对于众领域的开发者来说,依然对于国外的各种基础资源依赖还是非常的强.所以,一些网络基本技能一直都是我们需要掌握的,但是速度与稳定性问题一直也都有困扰着 ...

  4. AES加密中遇到的坑

    项目背景: 终端数据需要上传到后台,为了安全,使用了AES加密 问题1: 数据首先经过了protobuf进行格式,数据传输到后台无法解析 解决:二进制数据直接进行AES加密后大多无法正常解析,于是在加 ...

  5. Java开发者必备的六款工具

    每一位Java程序员都会有套工具来应对工作上的挑战.多年来,Java程序员使用软件来完成他们的工作.有很多工具对他们是有用的,不过对于初入行的人员来说,寻找合适的工具是困难的,并且是浪费时间的.而今天 ...

  6. java 学习必备的软件,持续更新中

    小编会持续更新在学习Java过程中需要的软件以及各种文件: 话不多说,看行动! 一:JDK (1)JDK1.8(*64): 链接:https://pan.baidu.com/s/1vM0jNXn2CT ...

  7. 解决RSA加密中,System.Security.Cryptography.CryptographicException: 系统找不到指定的文件

    首先说下环境,win2008R2,iis7.5 遇到这个问题,困扰了我一天,在外国的网站上找到答案,还好有点英文基础.最后算是解决了,不过其中的原理还是没有搞的十分清楚. 先说下解决办法, 打开IIS ...

  8. Java操作ini文件 ,解决properties文件中无法读取换行及空格

    1.依赖jar包 ini4j-0.5.4.jar 2.官网 http://ini4j.sourceforge.net/ 3.测试例子 [java] view plain copy package cn ...

  9. 一文看懂js中元素的滚动大小(scrollWidth,scrollHeight,scrollTop,scrollLeft)

    滚动大小(scroll dimension) 滚动大小指的是包含滚动内容元素的大小. 以下是与元素滚动内容大小相关的属性: 1. scrollWidth:在没有滚动条的情况下,元素内容的总宽度. 2. ...

  10. AES加密时抛出java.security.InvalidKeyException: Illegal key size or def

    原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...

随机推荐

  1. 交通规划四阶段法:基于 Python 的交通分布预测算法复现 - 附完整代码链接

    目录 交通规划四阶段法:基于 Python 的交通分布预测算法复现 - 附完整代码链接 我只是想使用这些代码 下载代码文件 代码的使用方法 合作 部分代码内容的展示 交通规划四阶段法:基于 Pytho ...

  2. selenium窗口之间的切换

    import time from selenium.webdriver import Edge from selenium.webdriver.common.by import By from sel ...

  3. 使用sqlcel导入数据时出现“a column named '***' already belongs to this datatable”问题的解决办法

    我修改编码为GBK之后,选择导入部分字段,如下: 这样就不会出现之前的问题了,完美 ----------------------------------------------- 但是出现一个问题,我 ...

  4. 解码技术债:AI代码助手与智能体的革新之道

    技术债 技术债可能来源于多种原因,比如时间压力.资源限制.技术选型不当等.它可以表现为代码中的临时性修补.未能彻底解决的设计问题.缺乏文档或测试覆盖等.虽然技术债可以帮助快速推进项目进度,但长期来看, ...

  5. Linux常用指令及shell脚本记录

    记录一些常用指令在博客上,以防哪天因太久不敲而忘却,还可以直接翻看博客记录,不用再一条条百度搜...... 一.Linux常用指令 一.设置文件权限为aapp用户及用户组-- chown -R app ...

  6. C++中的引用(Reference)

    1. 引用(Reference) 在 C++ 中,引用(Reference)是一个变量的别名. 它允许你通过不同的名字访问同一个变量. 与指针不同,引用在定义时必须被初始化,并且一旦绑定到某个变量,之 ...

  7. Java-MVC开发模式

    MVC开发模式 1. jsp演变历史 1. 早期只有Servlet,只能使用response输出标签数据,非常麻烦 2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大 ...

  8. [oeasy]python0 113_字符编码_VT100控制码_iso_8859_1_拉丁字符_latin

    拉丁字符 回忆上次内容 上次回顾了字型编码的进化过程 7-bit 的 点阵字库 终于让 字母.数字.标点 明确了字型     但是 7-bit 的 ascii中 没有法文字符的位置   ​   添加图 ...

  9. 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端

    1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...

  10. XR实时云渲染:助力虚拟仿真实训教学呈现

    近年来以5G.云计算.大数据.物联网.人工智能.虚拟现实/增强现实为代表的新兴技术迅速发展加速创新,日益融入经济社会发展各领域全过程,世界主要国家和地区纷纷加快数字化转型战略布局. 虚拟仿真系统是一种 ...