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í .

4voto

Dev G Punkte 1357

Ich habe auch das Problem, aber nach dem Ersetzen der bestehenden mit dem heruntergeladenen (von JCE) ein löste das Problem. Die neuen Krypto-Dateien boten unbegrenzte Stärke.

4voto

Aniket Thakur Punkte 62911

Wenn Sie eine Linux-Distribution mit apt verwenden und webupd8 PPA hinzugefügt haben, können Sie einfach den Befehl

apt-get install oracle-java8-unlimited-jce-policy

Andere Aktualisierungen:

  1. Die Dateien der Unlimited Strength Jurisdiction Policy sind enthalten in Java 9 und standardmäßig verwendet
  2. Beginnend mit Java 8 Aktualisierung 161 In Java 8 wird standardmäßig die Richtlinie "Unbegrenzte Stärke der Gerichtsbarkeit" verwendet.
  3. Beginnend mit Java 8 Aktualisierung 151 Die "Unlimited Strength Jurisdiction Policy" ist in Java 8 enthalten, wird aber standardmäßig nicht verwendet. Um sie zu aktivieren, müssen Sie die Datei java.security in <java_home>/jre/lib/security (für JDK) oder <java_home>/lib/security (für JRE). Unkommentieren (oder einfügen) Sie die Zeile

    crypto.policy=unlimited

    Stellen Sie sicher, dass Sie die Datei mit einem Editor bearbeiten, der als Administrator ausgeführt wird. Die Richtlinienänderung wird erst nach einem Neustart der JVM wirksam

Vor Java 8 Aktualisierung 151 Der Rest der Antworten ist gültig. JCE Unlimited Strength Jurisdiction Policy Files herunterladen und ersetzen.

Weitere Einzelheiten finden Sie in meinem persönlichen Blogbeitrag weiter unten - Wie installiert man Java Cryptography Extension (JCE) unbegrenzt starke Zuständigkeitsrichtlinien-Dateien?

3voto

keaplogik Punkte 2208

Standardmäßig unterstützt Java nur AES-Schlüsselgrößen von 128 Bit (16 Byte) für die Verschlüsselung. Wenn Sie nicht mehr als die standardmäßig unterstützte Größe benötigen, können Sie den Schlüssel auf die richtige Größe kürzen, bevor Sie Cipher . Siehe javadoc für standardmäßig unterstützte Schlüssel.

Dies ist ein Beispiel für die Erzeugung eines Schlüssels, der mit jeder JVM-Version funktioniert, ohne dass die Policy-Dateien geändert werden müssen. Die Verwendung liegt in Ihrem Ermessen.

Hier ist ein guter Artikel über die Bedeutung der Schlüsselgrößen 128 bis 256 auf AgileBits Blog

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}

2voto

Ahmed Ashour Punkte 4383

Ab Java 9 oder 8u151 können Sie eine Zeile in der Datei kommentieren:

<JAVA_HOME>/jre/lib/security/java.security

Und Veränderung:

#crypto.policy=unlimited

zu

crypto.policy=unlimited

1voto

Shaaban Ebrahim Punkte 8529

Es gibt zwei Möglichkeiten, dieses Problem zu lösen

Option Nummer 1 : Zertifikat mit geringerer Länge RSA 2048 verwenden

Option Nummer 2 : aktualisieren Sie zwei Jars in jre\lib\security was auch immer Sie für Java verwenden http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

oder Sie verwenden IBM Websphere oder einen anderen Anwendungsserver, der seine Java . das Hauptproblem, dass ich konfrontiert ich Zertifizierung mit maximaler Länge verwendet, wenn ich eingesetzt Ohren auf Websphere die gleiche Ausnahme ausgelöst wird

Java Security: Illegal key size or default parameters?

Ich habe den Java-Installationsordner in Websphere mit zwei Jars aktualisiert https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

Sie können die Referenz im Link überprüfen https://www-01.ibm.com/support/docview.wss?uid=swg21663373

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