迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 错误 Java.Security.InvalidKeyException: Illegal Key Size

作者:迹忆客 最近更新:2023/07/13 浏览次数:

本篇文章介绍包含 java.security.InvalidKeyException: Illegal key size 的 Java 代码。 然后,我们将了解其可能的原因。

最后,它通过消除指定的错误来引导我们找到解决方案。


Java 中 java.security.InvalidKeyException:Illegal key size

示例代码(App1.java 类):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {

    private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

    public String cryptAString(String str) {
        String ret = "";
        try {
            byte[] crypKeyData = this.crypKey.getBytes();
            SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

        } catch (NoSuchPaddingException |
                 NoSuchAlgorithmException |
                 InvalidKeyException |
                 UnsupportedEncodingException |
                 BadPaddingException |
                 IllegalBlockSizeException ex) {
            ex.printStackTrace();
        }
        return ret;
    }

}

加密密钥如下:

private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

上面给出的函数接受字符串类型参数。 当我们执行该程序时,它应该对其进行加密,但它给了我们 java.security.InvalidKeyException: Illegal key size 错误。

这意味着什么,原因是什么? 让我们在下一节中看看。


java.security.InvalidKeyException:Illegal key size 的可能原因

此错误意味着我们的 Java 虚拟机 (JVM) 使用的策略仅因美国出口法律而允许有限的加密密钥大小。

现在的重点是,为什么我们会收到此错误? 下面给出了两种可能性。

  1. 首先,我们使用需要 n 位加密的算法; 如果超过,我们会得到这个错误。
  2. 我们尚未安装无限强度管辖策略文件。

这些文件是什么? 这些文件是 Java 加密扩展 (JCE),它使 Java 应用程序能够利用强大的标准算法版本的优势。

根据 Java 文档,最新版本的 Java 开发工具包 (JDK) 不需要此类文件。 他们只需要使用旧版本的 JDK。

下一个问题是,我们应该为哪个 JDK 版本安装哪个文件? 下面我们就来学习一下。

Java 9 及更高版本

根据Java 9迁移指南中的安全更新,Java 9中已包含无限强度管辖策略文件,并且默认使用它们。

如果我们想要使用旧版本的 JDK 执行需要 JCE 无限强度管辖策略文件的应用程序,那么我们不必使用 Java 9 或更高版本下载并安装它们。 原因是它们已经默认包含并使用。

如果我们在使用 Java 9 时仍然遇到此错误,则策略配置将更改为更严格的策略(受限)。 但这不是问题,因为可用的 Java 加密策略文件有限。

第二个原因可能是在加密提供的字符串类型参数时使用了错误的算法。 有时,默认提供的任一策略文件都不能满足要求; 在这种情况下,我们可以自定义策略文件来满足我们的需求。

为此,请检查 <java-home>/conf/security/java.security 文件中名为 crypto.policy 的安全属性,或者我们也可以查看 Java 平台标准版安全开发人员指南的加密强度配置。

Java 8 及更早版本

  1. Java 8 Update 161 及更高版本 - 从 Java 8 u161 开始,Java 8 默认采用无限强度管辖策略。 如果仍然出现此错误,请将配置更改为受限。

    在下一节中,我们将看到将其更改为无限制的说明。

  2. Java 8 Update 151 及更高版本 - 从 Java 8 u151 开始,Java 8 中包含无限强度管辖策略,但默认情况下未激活。

    要激活它,我们需要编辑 java.security 文件,该文件可以在 /jre/lib/security(对于 JDK)或 /lib/security(对于 JRE)找到。 取消注释/包含以下行:

    crypto.policy=unlimited
    
    确保我们使用以管理员身份运行的编辑器编辑此文件。 不要忘记重新启动Java虚拟机,因为该策略只有在重新启动后才会生效。

    对于长时间运行的服务器进程(例如 Tomcat)尤其必要。 考虑到向后兼容性,按照下一节中的说明安装策略文件也将起作用。

  3. 在 Java 8 Update 151 之前 - 对于 Java 8 u144 及更早版本,我们必须安装 Java Cryptography Extension (JCE) 无限强度管辖策略文件,这些文件可在 Oracle 官方网站上找到。

请按照以下步骤安装这些文件:

  1. 下载 Java 加密扩展无限强度管辖权策略文件。

    我们可以到这里和这里分别下载Java 6和7的Java密码学扩展无限强度管辖策略文件。

  2. 解压缩它们并将它们提取到下载的文件中。 结果,将创建一个名为 jce 的子目录。

    该目录将包含以下文件:

    README.txt
    local_policy.jar
    US_export_policy.jar
    
  3. 安装无限强度策略 JAR 文件。 请记住,如果我们想要恢复到原始的强大但有限的策略版本,请复制原始的 Java 加密扩展策略文件(US_export_policy.jar 和 local_policy.jar)。
  4. 将强策略文件替换为我们在上一步中提取的无限强度版本。 Java 加密扩展管辖策略 JAR 文件的标准位置如下: ```bash
  5. 1 /lib/security for Unix Operating System.
  6. 2 \lib\security for Windows Operating System.
  7. 3 For JDK, it is in the jre/lib/security. ```

消除 java.security.InvalidKeyException: Illegal key size

示例代码(App1.java 类):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {

    private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

    public String cryptAString(String str) {
        String ret = "";
        try {
            byte[] crypKeyData = this.crypKey.getBytes();
            SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "ARCFOUR");
            Cipher cipher = Cipher.getInstance("ARCFOUR");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

        } catch (NoSuchPaddingException |
                 NoSuchAlgorithmException |
                 InvalidKeyException |
                 UnsupportedEncodingException |
                 BadPaddingException |
                 IllegalBlockSizeException ex) {
            ex.printStackTrace();
        }
        return ret;
    }

}

示例代码(Test.java 类):

public class Test {
    public static void main(String[] args) {
        App1 app = new App1();
        String str = "ThisIsFoundation";
        String cryptedStr = app.cryptAString(str);
        System.out.println(cryptedStr);
        System.out.println(cryptedStr.chars().count());
    }
}

它将把加密的字符串打印为 ?? c[D]???J??n? 其数量为 15 个字符。 我们是如何解决这个问题的?

我们可以通过两种方式摆脱 InvalidKeyException。

  1. 我们还可以通过安装 Java 加密扩展 (JCE) 策略文件来解决该问题(所有详细信息已在上一节中给出)。
  2. 我们还可以更改算法名称。

在我们的例子中,问题是由于 cryptoKey 的大小造成的,它大于 16 个字符。 因此,Cipher 类不允许我们使用超过 128 位的密钥大小进行加密(其中 128 位 == 16 字节 == 16 个字符)。

因此,crypKey 的值不能超过 16 个字符的限制。

要超过 16 个字符,我们要么安装 JCE 策略文件,要么更新算法名称。 我们将更改算法名称,因为我们想保留内置密钥大小限制。

因此,我们将算法名称从 AES 更新为 ARCFOUR。 这是因为 ARCFOUR 算法可以与各种密钥大小一起使用。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便