Java安全:非法密钥大小或默认参数?

Rih*_*rds 394 java

我之前曾问过一个关于这个问题的问题,但它没有得到正确的答案而且无处可去.

所以我已经澄清了关于这个问题的一些细节,我真的很想听听你如何解决这个问题或者我应该尝试什么的想法.

我在我的Linux服务器上安装了Java 1.6.0.12,下面的代码运行得非常完美.

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}
Run Code Online (Sandbox Code Playgroud)

今天我在我的服务器用户上安装了Java 1.6.0.26,当我尝试运行我的应用程序时,我得到以下异常.我的猜测是它与Java安装配置有关,因为它在第一个工作,但在更高版本中不起作用.

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted
Run Code Online (Sandbox Code Playgroud)

第25行是: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

注意:
*服务器的1.6.0.12 java目录中的java.security 几乎完全匹配1.6.0.26 java.security文件.第一个没有其他提供者.
*上一个问题在这里.

Jam*_*ack 712

您很可能现在没有安装无限强度文件.

您可能需要下载此文件:

Java密码术扩展(JCE)无限强度管辖政策文件6

Java密码术扩展(JCE)无限强度管辖权政策文件7下载

Java密码术扩展(JCE)无限强度管辖权政策文件8下载(仅适用于Java 8 u162之前的版本)

从zip中提取jar文件并将其保存${java.home}/jre/lib/security/.

  • 对于IBM的SDK(例如,WebSphere),从https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=jcesdk下载无限制的管辖区策略文件 (5认同)
  • 从Java 9和Java 8u151开始,不再需要下载和手动安装管辖区策略文件.要启用无限制加密,可以使用新的crypto.policy安全属性.如果在java.security文件中设置了新的安全属性(crypto.policy),或者在初始化JCE框架之前使用Security.setProperty()调用动态设置了该属性,那么将遵循该设置.默认情况下,该属性将是未定义的. (4认同)
  • 因此,此投票的答案现在已过时,已弃用。我们如何提高或抑制该答案,以便/sf/answers/3280038611/可以成为“已接受”的答案? (3认同)
  • @JamesBlack - 是的,为了确保涵盖所有基础,我把JAR放在`Java/jre/lib/security`,`Java/jdk/lib/security`和`Java/jdk/jre/lib/security下`.运行'java -version'会返回预期的详细信息. (2认同)
  • @JesseAdelman - 不幸的是,这已经快7岁了,可以做的不多.无论谁问,都需要改变它. (2认同)

Saa*_*lik 52

可以在此处找到JRE/JDK/Java 8管辖区文件:

Java密码术扩展(JCE)无限强度管辖权政策文件8下载

就像詹姆斯上面所说:
安装文件${java.home}/jre/lib/security/.

  • 新版本JDK 8u151具有"用于控制加密策略的新安全属性".现在,这是一个转换的属性更改.底线:从"lib\security\java.security"中的"#crypto.policy = unlimited"行中删除"#"以启用256位密钥.http://www.oracle.com/technetwork/java/javase/8u151-relnotes-3850493.html (9认同)
  • 尝试使用6和7,但他们没有工作.不得不安装8.谢谢. (2认同)

C D*_*pak 41

对于JAVA 7,下载链接是jce-7-download

复制Java\jdk1.7.0_10\jre\lib\security中的两个下载的jar
将较旧的jar备份放在更安全的一侧.

对于JAVA 8,下载链接是jce-8-download
复制下载的Java中的jars\jdk1.8.0_45\jre\lib\security
将较旧的jar备份放在更安全的一侧.


Seb*_*n S 35

对于Java 9,Java 8u161,Java 7u171Java 6u181,默认情况下现在禁用此限制.请参阅Java Bug数据库中的问题.


Java 8u151开始,您可以以编程方式禁用限制.

在旧版本中,必须单独下载和安装JCE管辖区文件,以允许JDK使用无限制的加密.不再需要下载和安装步骤.

相反,您现在可以在首次使用JCE类之前调用​​以下行(即最好在应用程序启动后立即调用):

Security.setProperty("crypto.policy", "unlimited");
Run Code Online (Sandbox Code Playgroud)


Jak*_*ako 30

这是一个仅限代码的解决方案.无需下载或搞乱配置文件.

这是一个基于反射的解决方案,在java 8上进行了测试

在程序的早期调用此方法一次.

//进口

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;
Run Code Online (Sandbox Code Playgroud)

//方法

public static void fixKeyLength() {
    String errorString = "Failed manually overriding key-length permissions.";
    int newMaxKeyLength;
    try {
        if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
            Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
            Constructor con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissionCollection = con.newInstance();
            Field f = c.getDeclaredField("all_allowed");
            f.setAccessible(true);
            f.setBoolean(allPermissionCollection, true);

            c = Class.forName("javax.crypto.CryptoPermissions");
            con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissions = con.newInstance();
            f = c.getDeclaredField("perms");
            f.setAccessible(true);
            ((Map) f.get(allPermissions)).put("*", allPermissionCollection);

            c = Class.forName("javax.crypto.JceSecurityManager");
            f = c.getDeclaredField("defaultPolicy");
            f.setAccessible(true);
            Field mf = Field.class.getDeclaredField("modifiers");
            mf.setAccessible(true);
            mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            f.set(null, allPermissions);

            newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        }
    } catch (Exception e) {
        throw new RuntimeException(errorString, e);
    }
    if (newMaxKeyLength < 256)
        throw new RuntimeException(errorString); // hack failed
}
Run Code Online (Sandbox Code Playgroud)

致谢:Delthas

  • 请注意,这可能违反了Java SE许可协议:_D.JAVA技术限制.您不得创建,修改或更改被许可方的行为,或授权其创建,修改或更改以任何方式标识为"java","javax","javax"的类,接口或子包的行为.在任何命名约定中,Oracle指定的javafx","sun","oracle"或类似约定.[...] _ [source](http://www.oracle.com/technetwork/java/javase/downloads /java-se-archive-license-1382604.html) (3认同)

小智 16

"Java密码学扩展(JCE)无限强度管辖政策文件6"

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html


ano*_*non 16

使用Windows 7 x64,Eclipse和JDK 1.6.0_30时遇到了同样的错误.在JDK安装文件夹中有一个jre文件夹.当我将上述罐子添加到JDK的lib/security文件夹中时,这让我一开始就没有运气.完整路径:

C:\Program Files\Java\jdk1.6.0_30\jre\lib\security
Run Code Online (Sandbox Code Playgroud)

将此存档jce文件夹中包含的文件下载并解压缩到该文件夹​​中.


小智 16

在Java中,默认情况下AES支持128位密钥,如果您计划使用192位或256位密钥,则java编译器将抛出非法密钥大小异常,您将获得该密钥.

解决方案是胜利者和詹姆斯建议的,你需要根据你的JRE版本(java6,java7或java8)下载JCE(Java Cryptography Extension).

JCE zip包含以下JAR:

  1. local_policy.jar
  2. 的US_export_policy.jar

你需要更换这些罐子<JAVA_HOME>/jre/lib/security.如果你在unix系统上,可能会参考/home/urs/usr/lib/jvm/java-<version>-oracle/

有时只是替换local_policy.jar,安全文件夹中的US_export_policy.jar在unix上不起作用,所以我建议先将安全文件夹复制到桌面,替换jar的@ Desktop/security文件夹,从/ jre/lib中删除安全文件夹/&将Desktop安全性文件夹移动到/ jre/lib /.

例如:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib


RHS*_*ger 5

还有的似乎是这个问题的一个简短的讨论在这里.它链接到的页面似乎已消失,但其中一个响应可能是您需要的:

实际上,将US_export_policy.jar和local_policy.jar从core/lib/jce复制到$ JAVA_HOME/jre/lib/security有帮助.谢谢.


max*_*max 5

如果安装JRE ,问题是jre\lib\security文件夹中local_policy.jar中文件default_local.policy内容:

// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.

grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128,
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128,
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};
Run Code Online (Sandbox Code Playgroud)

如果您不需要全球有效设置,您只需编辑此文件并将内容更改为

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};
Run Code Online (Sandbox Code Playgroud)

如果从Oracle下载JCE,那就是这个问题.