错误:java.security.InvalidKeyException: Illegal key size or default parameters解决方法

Java加密限制与解除方法
本文介绍了Java在加密算法上的限制,特别是密钥长度及部分算法的支持问题,并提供了如何通过部署无政策限制权限文件来解除这些限制的方法。

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环境中,就可以解决限制问题。
下载地址:
      ●Java 5.0 无政策限制文件
      ●Java 6 无政策限制文件
      ●Java 7 无政策限制文件
      ●其他版本 无政策限制文件

下载地址:1.6-1.8 jce

      下载的压缩包中仅有一个目录,也就是jce目录。该目录中包含了4个文件:README.txt、COPYRIGHT.html、local_policy.jar和US_export_policy.jar。其中包含的两个jar文件正是此次配置中用到的文件。
      我们可以查看上述README.txt文件,你需要在JDK的JRE环境中,或者是JRE环境中配置上述两个jar文件。
      切换到%JDK_Home%\jre\lib\security目录下,对应覆盖local_policy.jar和US_export_policy.jar两个文件。同时,你可能有必要在%JRE_Home%\lib\security目录下,也需要对应覆盖这两个文件。
      配置权限文件的最终目的是为了使应用在运行环境中获得相应的权限,可以加强应用的安全性。通常,我们在应用服务器上安装的是JRE,而不是JDK。因此,这就很有必要在应用服务器的%JRE_Home%\lib\security目录下,对应覆盖这两个权限文件。很多开发人员往往忽略了这一点,导致事故发生。

转自:http://www.wxdl.cn/java/security-invalidkey-exception.html

在使用SM4加密算法时,如果遇到 `java.security.InvalidKeyException: Illegal key size or default parameters` 异常,通常与Java加密策略限制有关,尤其是密钥长度限制。Java默认的加密策略限制了某些加密算法的密钥长度,例如SM4通常需要128位的密钥长度,而受限策略可能导致密钥被拒绝。 ### 异常原因 1. **Java加密策略限制**:Java的默认加密策略对部分算法的密钥长度进行了限制。如果使用了超过默认限制的密钥长度,Java会抛出 `InvalidKeyException`。 2. **密钥长度不足或超出限制**:SM4要求密钥长度为128位(16字节)。如果密钥长度不足或超出,也可能导致异常。 ### 解决方案 1. **替换策略文件**: 为了支持更长的密钥长度,可以替换JDK中的加密策略文件 `local_policy.jar` 和 `US_export_policy.jar`,以解除默认的加密限制。这些文件通常位于JDK的安装目录下的 `jre/lib/security` 文件夹中。 - 下载并替换策略文件:将新的策略文件(支持无限制加密)复制到 `$JAVA_HOME/jre/lib/security` 目录,并替换原有的文件。 - 策略文件获取方式:可以通过官方或可信的资源获取支持无限制加密的策略文件。 2. **启用无限制加密策略**: 在JDK 8及以上版本中,可以通过修改 `java.security` 配置文件来启用无限制加密策略。 - 打开 `$JAVA_HOME/jre/lib/security/java.security` 文件。 - 找到并取消注释以下配置项: ```properties crypto.policy=unlimited ``` - 保存文件并重启应用,即可解除加密限制。 3. **验证密钥长度**: 确保提供的SM4密钥长度符合要求(128位,即16字节)。如果密钥长度不正确,应调整密钥生成逻辑。 ```java byte[] keyBytes = "1234567890abcdef".getBytes(StandardCharsets.UTF_8); // 16字节的密钥 SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "SM4"); Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); ``` 4. **检查加密提供者**: 确保使用的加密提供者支持SM4算法。例如,Bouncy Castle提供者支持SM4加密。可以通过添加Bouncy Castle依赖来扩展Java的加密能力。 ```java Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", "BC"); ``` 通过以上方法,可以有效解决SM4加密时出现的 `InvalidKeyException` 异常问题。确保密钥长度正确且加密策略无限制,是解决此类问题的关键。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值