Ich habe eine App, die 256-Bit-AES-Verschlüsselung verwendet, die von Java nicht sofort unterstützt wird. Ich weiß, damit dies richtig funktioniert, installiere ich die JCE-Gläser mit unbegrenzter Stärke im Sicherheitsordner. Für mich als Entwickler ist das in Ordnung, ich kann sie installieren.
Meine Frage ist, da diese App verteilt wird, werden Endbenutzer diese Richtliniendateien höchstwahrscheinlich nicht installiert haben. Es ist keine attraktive Lösung, wenn der Endbenutzer diese nur herunterlädt, damit die App funktioniert.
Gibt es eine Möglichkeit, meine App auszuführen, ohne Dateien auf dem Endbenutzercomputer zu überschreiben? Eine Software von Drittanbietern, die damit umgehen kann, ohne dass die Richtliniendateien installiert sind? Oder eine Möglichkeit, diese Richtliniendateien einfach aus einer JAR heraus zu referenzieren?
quelle
Antworten:
Es gibt einige häufig zitierte Lösungen für dieses Problem. Leider ist keines davon völlig zufriedenstellend:
Aber dann gibt es Reflexion. Gibt es etwas, das Sie mit Reflexion nicht tun können?
Rufen Sie einfach
removeCryptographyRestrictions()
von einem statischen Initialisierer oder ähnlichem auf, bevor Sie kryptografische Operationen ausführen.Der
JceSecurity.isRestricted = false
Teil ist alles, was benötigt wird, um 256-Bit-Chiffren direkt zu verwenden. Ohne die beiden anderen VorgängeCipher.getMaxAllowedKeyLength()
werden jedoch weiterhin 128 gemeldet, und 256-Bit-TLS-Verschlüsselungssuiten funktionieren nicht.Dieser Code funktioniert unter Oracle Java 7 und 8 und überspringt den Prozess unter Java 9 und OpenJDK automatisch, wenn er nicht benötigt wird. Da es sich schließlich um einen hässlichen Hack handelt, funktioniert es wahrscheinlich nicht auf den VMs anderer Anbieter.
Es funktioniert auch nicht unter Oracle Java 6, da die privaten JCE-Klassen dort verschleiert sind. Die Verschleierung ändert sich jedoch nicht von Version zu Version, sodass es technisch immer noch möglich ist, Java 6 zu unterstützen.
quelle
final
ich in 8u111 Probleme mit dem Feld hatte, habe ich es so geändert, dass es das endgültige Feld nach dieser Antwort ändern kann . Das Ergebnis entspricht in etwa der neuen Version von ntoskrnl, nur dass ich es nichtmodifiersField
als deklariert habefinal
. Einer meiner Benutzer berichtet, dass es auch in 8u112 funktioniert.Dies wird jetzt weder für Java 9 noch für eine neuere Version von Java 6, 7 oder 8 benötigt. Endlich! :) :)
Per JDK-8170157 wird die unbegrenzte Verschlüsselungs Politik jetzt standardmäßig aktiviert.
Spezifische Versionen aus der JIRA-Ausgabe:
Beachten Sie, dass das alte Verhalten, wenn es aus irgendeinem Grund in Java 9 benötigt wird, wie folgt festgelegt werden kann:
quelle
Hier ist die Lösung: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html
quelle
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
Feld endgültig ist ( bugs.openjdk.java.net/browse/JDK-8149417 ). Die Antwort von @ ntoskrnl kümmert sich um die mögliche Aufnahme eines "endgültigen" Modifikators. @ M.Dudleys Kommentar zum Java-Lizenzvertrag gilt auch weiterhin.In der Hüpfburg müssen, soweit ich das beurteilen kann, immer noch Gläser installiert werden.
Ich habe einen kleinen Test gemacht und es schien dies zu bestätigen:
http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions
quelle
Ab JDK 8u102 funktionieren die auf Reflexion basierenden veröffentlichten Lösungen nicht mehr: Das Feld, das diese Lösungen festlegen, ist jetzt
final
( https://bugs.openjdk.java.net/browse/JDK-8149417 ).Es sieht so aus, als ob entweder (a) Bouncy Castle verwendet oder (b) die JCE-Richtliniendateien installiert werden.
quelle
isRestricted
Feld, da sie sich um eine mögliche Hinzufügung eines "endgültigen" Modifikators kümmert.Eine alternative Kryptografiebibliothek finden Sie in Bouncy Castle . Es hat AES und viele zusätzliche Funktionen. Es ist eine liberale Open Source Bibliothek. Sie müssen jedoch die leichte, proprietäre Bouncy Castle-API verwenden, damit dies funktioniert.
quelle
Sie könnten Methode verwenden
Um die verfügbare Schlüssellänge zu testen, verwenden Sie diese und informieren Sie den Benutzer über die aktuellen Vorgänge. Etwas, das besagt, dass Ihre Anwendung auf 128-Bit-Schlüssel zurückgreift, weil beispielsweise die Richtliniendateien nicht installiert sind. Sicherheitsbewusste Benutzer installieren die Richtliniendateien, andere verwenden weiterhin schwächere Schlüssel.
quelle
Für unsere Anwendung hatten wir eine Client-Server-Architektur und erlaubten nur das Entschlüsseln / Verschlüsseln von Daten auf Serverebene. Daher werden die JCE-Dateien nur dort benötigt.
Wir hatten ein weiteres Problem, bei dem wir ein Sicherheitsglas auf den Client-Computern aktualisieren mussten. Über JNLP werden die Bibliotheken
${java.home}/lib/security/
und die JVM beim ersten Start überschrieben .Das hat funktioniert.
quelle
Hier ist eine aktualisierte Version der Antwort von ntoskrnl . Es enthält zusätzlich eine Funktion zum Entfernen des endgültigen Modifikators wie Arjan , der in den Kommentaren erwähnt wird.
Diese Version funktioniert mit JRE 8u111 oder neuer.
quelle
((Map<?, ?>) perms.get(defaultPolicy)).clear();
gibt einen Compilerfehler aus. Das Auskommentieren scheint die Funktionalität nicht zu beeinträchtigen. Ist diese Leitung notwendig?Hier ist eine modifizierte Version des Codes von @ ntoskrnl, die die
isRestrictedCryptography
Überprüfung durch tatsächlicheCipher.getMaxAllowedKeyLength
slf4j-Protokollierung und die Unterstützung der Singleton-Initialisierung vom Anwendungs-Bootstrap wie folgt enthält :Dieser Code würde die Reflexion korrekt beenden, wenn in Java 8u162 standardmäßig unbegrenzte Richtlinien verfügbar sind, wie die Antwort von @ cranphin vorhersagt.
quelle
Fordern Sie den Benutzer während der Installation Ihres Programms einfach auf, ein DOS-Batch-Skript oder ein Bash-Shell-Skript herunterzuladen, und kopieren Sie das JCE an den richtigen Systemspeicherort.
Früher musste ich dies für einen Server-Webservice tun, und anstelle eines formalen Installationsprogramms habe ich nur Skripts zum Einrichten der App bereitgestellt, bevor der Benutzer sie ausführen konnte. Sie können die App so lange nicht mehr ausführen, bis das Setup-Skript ausgeführt wird. Sie könnten die App auch dazu bringen, sich über das Fehlen des JCE zu beschweren, und dann darum bitten, die App herunterzuladen und neu zu starten?
quelle