Java 错误 Java.Security.InvalidKeyException: Illegal Key Size
本篇文章介绍包含 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) 使用的策略仅因美国出口法律而允许有限的加密密钥大小。
现在的重点是,为什么我们会收到此错误? 下面给出了两种可能性。
- 首先,我们使用需要 n 位加密的算法; 如果超过,我们会得到这个错误。
- 我们尚未安装无限强度管辖策略文件。
这些文件是什么? 这些文件是 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 及更早版本
-
Java 8 Update 161 及更高版本 - 从 Java 8 u161 开始,Java 8 默认采用无限强度管辖策略。 如果仍然出现此错误,请将配置更改为受限。
在下一节中,我们将看到将其更改为无限制的说明。
-
Java 8 Update 151 及更高版本 - 从 Java 8 u151 开始,Java 8 中包含无限强度管辖策略,但默认情况下未激活。
要激活它,我们需要编辑 java.security 文件,该文件可以在
(对于 JDK)或/jre/lib/security
(对于 JRE)找到。 取消注释/包含以下行:/lib/security crypto.policy=unlimited
对于长时间运行的服务器进程(例如 Tomcat)尤其必要。 考虑到向后兼容性,按照下一节中的说明安装策略文件也将起作用。
- 在 Java 8 Update 151 之前 - 对于 Java 8 u144 及更早版本,我们必须安装 Java Cryptography Extension (JCE) 无限强度管辖策略文件,这些文件可在 Oracle 官方网站上找到。
请按照以下步骤安装这些文件:
-
下载 Java 加密扩展无限强度管辖权策略文件。
我们可以到这里和这里分别下载Java 6和7的Java密码学扩展无限强度管辖策略文件。
-
解压缩它们并将它们提取到下载的文件中。 结果,将创建一个名为 jce 的子目录。
该目录将包含以下文件:
README.txt local_policy.jar US_export_policy.jar
- 安装无限强度策略 JAR 文件。 请记住,如果我们想要恢复到原始的强大但有限的策略版本,请复制原始的 Java 加密扩展策略文件(US_export_policy.jar 和 local_policy.jar)。
- 将强策略文件替换为我们在上一步中提取的无限强度版本。 Java 加密扩展管辖策略 JAR 文件的标准位置如下: ```bash
-
1
/lib/security for Unix Operating System. -
2
\lib\security for Windows Operating System. - 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。
- 我们还可以通过安装 Java 加密扩展 (JCE) 策略文件来解决该问题(所有详细信息已在上一节中给出)。
- 我们还可以更改算法名称。
在我们的例子中,问题是由于 cryptoKey 的大小造成的,它大于 16 个字符。 因此,Cipher 类不允许我们使用超过 128 位的密钥大小进行加密(其中 128 位 == 16 字节 == 16 个字符)。
因此,crypKey 的值不能超过 16 个字符的限制。
要超过 16 个字符,我们要么安装 JCE 策略文件,要么更新算法名称。 我们将更改算法名称,因为我们想保留内置密钥大小限制。
因此,我们将算法名称从 AES 更新为 ARCFOUR。 这是因为 ARCFOUR 算法可以与各种密钥大小一起使用。
相关文章
Java 中 Re-Throw Exception 异常
发布时间:2023/07/15 浏览次数:61 分类:Java
-
在Java中,throw是最常用的关键字,用于抛出内置异常或用户定义的异常,但有时我们必须通过catch块抛出相同的异常。
使用 Java 连接 FTPS 服务器
发布时间:2023/07/14 浏览次数:76 分类:Java
-
安全文件传输协议 (FTPS) 是文件传输协议 (FTP) 的安全版本,它使用 SSL/TLS 加密来保护客户端和服务器之间传输的数据。 本文将介绍如何使用 Java 安全通道 (JSSE) API 连接到 Java 中的 FTPS 服务器。
使用 Java 创建 X.509 证书
发布时间:2023/07/14 浏览次数:107 分类:Java
-
X.509 是一种广泛使用的公钥基础设施 (PKI) 标准,用于保护和验证互联网上的交易。本文将教我们如何使用 Java 创建 X.509 证书。
Java 中错误 Unsupported Major Minor Version
发布时间:2023/07/14 浏览次数:68 分类:Java
-
出现 Unsupported Major.minor version 错误或 Java.lang.UnsupportedClassVersionError 的原因是运行时 JDK 较低,编译时 JDK 较高。 本篇文章介绍如何解决Java中不支持的major.minor版本。
Java 错误 Error:Java: Javactask: Source Release 1.8 Requires Target Release 1.8
发布时间:2023/07/14 浏览次数:200 分类:Java
-
在使用IntelliJ for Java时,无法编译Java程序是一个常见的问题。 本教程提供了此错误的解决方案。Error:Java: Javactask: Source Release 1.8 Requires Target Release 1.8 错误
解决 Java 异常 Unable to Instantiate org.apache.hadoop.hive.ql.metadata.Sessi
发布时间:2023/07/14 浏览次数:183 分类:Java
-
本篇文章介绍如何解决 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient。Apache Hive 是一款开源数据仓库软件,用于读取、管理和写入存储在 Hadoop 文件中的大
Java 中 Could Not Find Java SE Runtime Environment 错误
发布时间:2023/07/14 浏览次数:149 分类:Java
-
当安装了运行时环境时,即 Java 找不到主 java.dll 文件时,可能会出现“Could not find Java SE Runtime Environment”错误。 本篇文章介绍如何解决 Java 中的“Could not find Java SE Runtime Environment”错误。
Java 中错误 java.net.SocketException: Software Caused Connection Abort: Recv F
发布时间:2023/07/14 浏览次数:75 分类:Java
-
本篇文章介绍如何解决 Java 中的以下错误:java.net.SocketException: Software caused connection abort: recv failed SocketException 是 IOException 的子类,当我们尝试访问套接字时会发生 IOException。
解决 Java Lang Index Out of Bounds Exception 异常
发布时间:2023/07/14 浏览次数:62 分类:Java
-
本篇文章我们将讨论考虑数组和 ArrayList 的 IndexOutOfBoundsException 错误。 我们还将了解导致此错误的原因以及最后如何解决它。java.lang.IndexOutOfBoundsException 的原因