首页 > 编程语言 >Java 开发者必备:一文解决 AES 加密中的“非法密钥大小”异常

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

时间:2024-08-16 20:39:44浏览次数:13  
标签:AES java JCE Cipher 开发者 版本 Java 密钥

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

重新启动应用程序:

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

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

 

 

标签:AES,java,JCE,Cipher,开发者,版本,Java,密钥
From: https://www.cnblogs.com/xsge/p/18363327

相关文章

  • 暑假Java自学进度总结06
    一.今日所学:1.for循环for(初始化语句;条件判断语句;条件控制语句){循环体语句;}执行流程:1>执行初始化语句2>执行条件判断语句,若为true则执行循环体语句,若为false,循环结束3>执行条件控制语句4>回到2>继续执行条件判断语句注:初始化语句只执行一次2.while循环初始化语句;......
  • Java基础
    Java基础1注释单行注释格式://注释信息多行注释格式:/*注释信息*/文档注释格式:/**注释信息*/注:新手小白,文档注释暂时用不上。publicclassHelloWorld{publicstaticvoidmain(String[]args){//叫做main方法,程序的主入口S......
  • Java入门基础篇
    一、java简介:java是一种广泛使用的高级编程语言,由SunMicrosystems公司于1995年推出。Java的设计目标之一是实现“一次编写,到处运行”的能力,即编写的代码可以在任何支持Java的平台上运行,而无需进行额外的修改。Java广泛应用于企业级应用、桌面应用、移动应用和Web开发等领域。......
  • 【蓝桥杯】第七届蓝桥杯大赛个人赛省赛(软件类)Java 大学C组 真题
    第七届蓝桥杯大赛个人赛省赛(软件类)Java大学C组真题及部分解析A 有奖猜谜小明很喜欢猜谜语。最近,他被邀请参加了X星球的猜谜活动。每位选手开始的时候都被发给777个电子币。规则是:猜对了,手里的电子币数目翻倍,猜错了,扣除555个电子币,扣完为止。小明一共猜了15条谜语......
  • 10步打造专业级Java FX应用:从入门到放弃的艺术
    ......
  • 文心快码Baidu Comate 帮你解大厂面试题:Java G1 GC中,region是什么意思?有哪些不同的reg
    ......
  • JAVA毕业设计161—基于Java+Springboot+vue+微信小程序的校园论坛二手闲置系统(源代码
    毕设所有选题:https://blog.csdn.net/2303_76227485/article/details/131104075基于Java+Springboot+vue+微信小程序的校园论坛二手闲置系统(源代码+数据库+万字论文)161一、系统介绍本项目前后端分离带小程序,分为用户、管理员两种角色,可自行分配角色菜单1、用户:注册、......
  • 《提升前端性能的 JavaScript 技巧》
    在前端开发中,性能优化是至关重要的一环。JavaScript作为前端开发的核心语言,掌握一些关键的技巧可以显著提升应用的性能。本文将为您介绍一些实用的JavaScript技巧,帮助您优化前端性能。一、避免不必要的计算在代码中,尽量避免在频繁执行的代码块中进行复杂且不必要的计算。......
  • day22 Java基础——方法(干货)
    day22Java基础——方法在Java中,方法是一段组织好的、可重复使用的代码块,用于执行一个特定的操作。方法提供了一种封装代码的方式,使得代码模块化,便于管理和重用。以下是关于Java中方法的一些基本介绍:文章目录day22Java基础——方法1.方法的定义2.方法的调用2.1方法......
  • 下载量突破400万,百万开发者首选的 AI 编码工具通义灵码是如何炼成的?
    通义灵码是由阿里云和通义实验室联合推出的一款基于通义大模型的智能编码辅助工具,它具备代码智能生成和研发智能问答等多项功能,旨在帮助开发者提高编码效率和代码质量。我们非常高兴的宣布,通义灵码插件下载量突破400万啦!目前,通义灵码每天推荐代码超3000万次,被开发者采纳代码......