前言:
在使用 javax.crypto 相关类下AES 解密时,出现这个错误,但是在有的 jdk8 版本不会出现这个问题,研究发现是 jdk8 偏低版本会出现这个问题。jdk1.8.0_131 会出现, jdk1.8.0_221 不会解决, 发现是JDK 8u162 修复的
具体的解释, 以后如果学习密码相关的知识再回头来详细解释吧
可以参考 添加链接描述
旧版本Java 需要单独下载JCE长度策略,Oracle官网有,这是 Java 本身的限制,这个限制存在的原因是美国出口法案,高强度加密算法禁止出口
这三个版本的发布顺序是:jdk1.8.0_131、JDK 8u162、jdk1.8.0_221
错误详细信息
Exception in thread “main” java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
at javax.crypto.Cipher.implInit(Cipher.java:805)
at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
at javax.crypto.Cipher.init(Cipher.java:1396)
at javax.crypto.Cipher.init(Cipher.java:1327)
at org.springblade.core.tool.utils.AesUtil.aes(AesUtil.java:268)
at org.springblade.core.tool.utils.AesUtil.decrypt(AesUtil.java:251)
at org.springblade.core.tool.utils.AesUtil.decrypt(AesUtil.java:229)
at org.springblade.core.tool.utils.AesUtil.decryptFormBase64(AesUtil.java:207)
at org.springblade.core.tool.utils.AesUtil.decryptFormBase64(AesUtil.java:196)
at org.springblade.core.tool.utils.AesUtil.decryptFormBase64ToString(AesUtil.java:177)
at Test.main(Test.java:5)
下面是文心一言的解释:
“Illegal key size”(非法密钥长度)是在Java开发中常见的一个错误提示,通常出现在尝试使用超出Java加密扩展(JCE)默认限制的密钥大小进行加密操作时。以下是对这个错误的详细解释以及解决方案:
错误原因
- JCE策略文件限制:Java默认的安全策略文件限制了密钥的最大长度。在JDK 1.8及以后的版本中,如果密钥长度超过128位(例如,尝试使用AES-256),就可能触发此错误。这些限制源于历史上的美国政府对加密强度的出口管制政策。
- 加密库或算法限制:除了JCE策略文件的限制外,如果使用的加密库或算法本身对密钥长度有特定要求或限制,也可能导致“Illegal key size”错误。
解决方案
-
下载并替换JCE策略文件:
- 前往Oracle官网下载对应JDK版本的JCE Unlimited Strength Jurisdiction Policy Files。
- 找到JDK安装目录下的
lib/security
文件夹,备份原始的local_policy.jar
和US_export_policy.jar
文件。 - 将下载的
local_policy.jar
和US_export_policy.jar
文件复制到上述目录,替换原有文件。 - 重启应用程序以使更改生效。
-
编程方式解除限制(适用于JDK 8u151及之后的版本):
- 对于JDK 8u151及之后的版本,可以通过编程方式动态修改加密策略,以解除对密钥长度的限制。示例代码如下:
import java.security.Security; public class CryptoPolicy { static { try { Security.setProperty("crypto.policy", "unlimited"); } catch (SecurityException e) { // Handle the exception if necessary } } }
- 在应用程序的启动代码中调用上述类,即可在运行时解除对密钥长度的限制。
-
升级JDK版本:
- 对于JDK 8u162及之后的版本,默认已经支持无限制强度的加密政策。因此,升级JDK版本也是一种解决方案。
- 下载并安装最新版本的JDK。
- 配置环境变量,确保系统使用新安装的JDK版本。
- 重启开发环境或应用程序。
-
检查加密库和算法:
- 确保所使用的加密库和算法支持所需的密钥长度。如果加密库或算法本身有限制,需要寻找替代方案或更新版本。
-
其他注意事项:
- 在实施上述任一解决方案后,重新运行应用程序以验证是否解决了“Illegal key size”报错问题。
- 如果问题仍然存在,可能需要检查其他潜在的配置或代码问题。
- 增强加密能力的同时,也提升了数据保护级别。但在非监管环境外使用无限强度的加密可能会受到特定地区法律法规的限制,请依法使用。
综上所述,“Illegal key size”错误通常是由于JCE策略文件的限制或加密库/算法的限制导致的。通过下载并替换JCE策略文件、编程方式解除限制、升级JDK版本或检查加密库和算法等方法,可以有效解决此问题。
高版本:
在JDK 1.8.0_221版本中,通常不会遇到java.security.InvalidKeyException: Illegal key size
这个异常,前提是您没有受到其他环境或配置的限制。从Java 8 Update 151(8u151)开始,Oracle引入了新的安全属性crypto.policy
,使得用户可以通过设置此属性来控制JDK使用的JCE权限策略文件。默认情况下,或者在没有明确设置crypto.policy
属性的情况下,并且传统的JCE权限文件(如local_policy.jar
和US_export_policy.jar
)不存在于lib/security
目录中时,JDK将使用“受限”的加密级别。
然而,在JDK 1.8.0_221中,由于它属于Java 8的一个较新版本,通常已经默认支持了无限制强度的加密,无需额外安装JCE策略文件。这意味着您应该能够使用AES加密算法和超过128位的密钥长度,而不会遇到密钥大小不合法的异常。
但是,仍然有几个因素可能导致您遇到这个问题:
-
环境配置不一致:如果您的开发环境和生产环境(或不同机器上的测试环境)之间的JDK配置不一致,可能会导致加密操作的行为不同。确保所有环境都使用相同版本的JDK,并且没有额外的安全限制。
-
安全软件或防火墙:某些安全软件或防火墙设置可能会阻止Java程序执行加密操作。检查您的安全软件设置,确保它们不会干扰Java加密功能的正常使用。
-
代码问题:如果您的代码中硬编码了密钥大小的限制,或者使用了不正确的加密配置,也可能会导致这个异常。仔细检查您的代码,确保它符合AES加密的标准要求。
-
操作系统或硬件差异:虽然不太常见,但有时操作系统或硬件的差异也可能影响Java加密功能的行为。尝试在相同操作系统和硬件配置的机器上复现问题,以排除这种可能性。
总之,在JDK 1.8.0_221中,您通常应该能够使用AES加密算法和超过128位的密钥长度而不会遇到问题。如果遇到问题,请检查上述可能的原因,并采取相应的措施进行解决。