【Java用法】加密异常----Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Java用法】加密异常----Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

一、错误信息

您正在使用Java加密扩展开发漂亮的应用程序,并且使用长度超过128位的密钥时,您会遇到以下错误:

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

您所做的一切都是正确的:JDK在默认情况下有一个专门的密钥大小限制,因此您不能使用密钥超过128位的加密。

Java官方文档:Oracle’s documentation。

二、错误原因

其实,Java几乎各种常用加密算法都能找到对应的实现。但是因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在一些问题:

  • 密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters);
  • 部分算法未能支持,如MD4、SHA-224等算法;
  • API使用起来还不是很方便;一些常用的进制转换辅助工具未能提供,如Base64编码转换、十六进制编码转换等工具。

   Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在JRE环境中,就可以解决限制问题。

由于一些国家政府的进口控制限制,Sun Microsystems提供的JDK 5.0附带的管辖政策文件指定可以使用“强”但有限的加密。

有些国家对加密算法使用的允许密钥强度有限制:

这些文件的“无限强度”版本表明对密码强度没有限制,适用于居住在合格国家(即大多数国家)的人。但只有“强大”的版本才能被输入那些政府强制限制的国家。JCE框架将强制执行已安装的管辖权策略文件中指定的限制。

三、解决方案

那么,如何删除密钥的大小限制呢?

方法1:通过反射进行修改

    /**
     * 1、通过反射去除JCE加密限制,此方法只限于Java1.8,直接复制(可能报错,引用java.lang.reflect下的包即可)
     * 2、在main方法中加密操作之前调用一下这个方法就OK了
     */
    private static void removeJceLimit() {
        try {
            Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
            field.setAccessible(true);
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            field.set(null, false);
            log.info("============= remove the key size restriction Success =============");
        } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
            ex.printStackTrace(System.err);
        }
    }

注意:使用方法1,解决这个问题的时候,自测加密是可以的,但是,在解密的时候 还会报错,所以最稳妥的办法还是方法2。

方法2:下载官方Jar包修改

您可以使用无限制强度的策略jar替换现有的JCE jar,从而消除最大密钥限制(JAVA官网提供两个版本的Jar包,以下是官网下载地址):

1、对于Java 5 的JCE jar包下载地址如下:Java 5.0 无政策限制文件

2、对于Java 6 的JCE jar包下载地址如下:Java 6 无政策限制文件

3、对于Java 7 的JCE jar包下载地址如下:Java 7 无政策限制文件

4、对于Java 8 的JCE jar包下载地址如下:Java 8 无政策限制文件

5、对于Java 其他版本 的JCE jar包下载地址如下:其他版本 无政策限制文件

将上面zip文件中提取的local_policy.jar和US_export_policy.jar复制到$JAVA_HOME/jre/lib/security。

然后只需重新启动java应用程序,异常就会消失。

具体步骤:

1、下载的压缩包中仅有一个目录,也就是jce目录。该目录中包含了4个文件:README.txt、COPYRIGHT.html、local_policy.jar和US_export_policy.jar。其中包含的两个jar文件正是此次配置中用到的文件。

2、我们可以查看上述README.txt文件,你需要在JDK的JRE环境中,或者是JRE环境中配置上述两个jar文件。

3、切换到%JDK_Home%\jre\lib\security目录下,对应覆盖local_policy.jar和US_export_policy.jar两个文件。同时,你可能有必要在%JRE_Home%\lib\security目录下,也需要对应覆盖这两个文件。

4、配置权限文件的最终目的是为了使应用在运行环境中获得相应的权限,可以加强应用的安全性。通常,我们在应用服务器上安装的是JRE,而不是JDK。所以很有必要在应用服务器的%JRE_Home%\lib\security目录下,对应覆盖这两个权限文件。

 

 

【参考资料】

Andrea Fortuna:https://www.andreafortuna.org/2016/06/08/java-tips-how-to-fix-the-invalidkeyexception-illegal-key-size-or-default-parameters-runtime/


相关文章
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
4天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
9天前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
22 2
|
25天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
70 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
|
2月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
2月前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
|
2月前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
131 1
|
3月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
3月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。