441 Stimmen

Java-Sicherheit: Unzulässige Schlüsselgröße oder Standardparameter?

Ich hatte bereits eine Frage dazu gestellt, die aber nicht richtig beantwortet wurde und zu nichts führte.

Ich habe also einige Details zum Problem geklärt und würde gerne Ihre Ideen hören, wie ich das Problem beheben kann oder was ich versuchen sollte.

Ich habe Java 1.6.0.12 auf meinem Linux-Server installiert und der folgende Code läuft einwandfrei.

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);
}

Heute habe ich Java 1.6.0.26 auf meinem Server-Benutzer und wenn ich versuche, meine Anwendung auszuführen, erhalte ich die folgende Ausnahme. Ich vermute, dass es etwas mit der Java-Installationskonfiguration zu tun hat, da es in der ersten Version funktioniert, in der späteren Version aber nicht mehr.

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

Zeile 25 ist: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Anmerkungen:
* java.security auf dem Server 1.6.0.12 java-Verzeichnis stimmt fast vollständig mit dem 1.6.0.26 java.security-Datei. In der ersten Datei gibt es keine zusätzlichen Anbieter.
* Die vorherige Frage lautet aquí .

752voto

James Black Punkte 41034

Wahrscheinlich haben Sie die Datei mit der unbegrenzten Stärke noch nicht installiert.

Möglicherweise müssen Sie diese Datei herunterladen:

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download (nur erforderlich für Versionen vor Java 8 u162)

Extrahieren Sie die jar-Dateien aus der ZIP-Datei und speichern Sie sie in ${java.home}/jre/lib/security/ .

57voto

Saad Malik Punkte 1474

Die JRE/JDK/Java 8 Zuständigkeitsdateien finden Sie hier:

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download

Wie James oben sagte:
Installieren Sie die Dateien in ${java.home}/jre/lib/security/ .

48voto

Sebastian S Punkte 4140

Mit Java 9, Java 8u161 , Java 7u171 y Java 6u181 ist die Begrenzung nun standardmäßig deaktiviert. Siehe Problem in der Java Bug Database .


Beginnend mit Java 8u151 können Sie die Begrenzung programmatisch deaktivieren.

In älteren Versionen mussten die JCE-Zuständigkeitsdateien separat heruntergeladen und installiert werden, damit das JDK unbegrenzt Kryptographie verwenden konnte. Die Schritte zum Herunterladen und Installieren sind nicht mehr erforderlich.

Stattdessen können Sie nun die folgende Zeile vor der ersten Verwendung von JCE-Klassen aufrufen (d.h. vorzugsweise direkt nach dem Start der Anwendung):

Security.setProperty("crypto.policy", "unlimited");

43voto

C Deepak Punkte 1258

Für JAVA 7 lautet der Download-Link jce-7-download

Kopieren Sie die beiden heruntergeladenen JAR-Dateien in Java \jdk1.7.0_10\jre\lib\security
Nehmen Sie eine Sicherungskopie älterer Gläser mit, um auf Nummer sicher zu gehen.

Für JAVA 8 lautet der Download-Link jce-8-download
Kopieren Sie die heruntergeladenen Jars in Java \jdk1.8.0_45\jre\lib\security
Nehmen Sie eine Sicherungskopie älterer Gläser mit, um auf Nummer sicher zu gehen.

35voto

Jako Punkte 2359

Dies ist eine Nur-Code-Lösung . Sie brauchen keine Konfigurationsdateien herunterzuladen oder sich mit ihnen herumzuschlagen.

Es handelt sich um eine auf Reflexion basierende Lösung, getestet mit Java 8

Rufen Sie diese Methode einmal zu Beginn Ihres Programms auf.

//Einfuhren

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

//Methode

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
}

Credits: Delthas

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X