Sie benötigen keine Richtliniendatei mehr.
Es ist wichtig, also sage ich es noch einmal. Sie benötigen keine Richtliniendatei mehr.
Java verwendet die Standardbibliothek Cipher-Klasse, um AES-Chiffren ohne Verwendung von Bibliotheken von Drittanbietern zu verarbeiten. Die AES-Verschlüsselung scheint jedoch US-Exportbeschränkungen zu unterliegen, und der Standard kann nur Schlüssel mit bis zu 128 Bit verarbeiten. Es ist bekannt, dass in Ländern wie Japan, die dieser Exportkontrolle nicht unterliegen, eine Richtliniendatei mit unbegrenzter Stärke separat von Oracle heruntergeladen und auf dem System überschrieben werden muss.
Es wäre schön, wenn ich die AES 256-Verschlüsselung durch Ersetzen der Richtliniendatei verwenden könnte, aber ... um ehrlich zu sein, ist es sehr ärgerlich. Es ist mühsam, dies jemandem zu erklären, der nicht weiß, was passiert ist, und es ist auch mühsam, es jedes Mal zu ersetzen, wenn Sie das JDK aktualisieren. Wenn es nur ein Ärger ist, besteht immer noch die Gefahr, dass Sie vergessen oder Fehler machen.
In Java 9 wird diese Richtliniendatei bereits mit dem JDK ausgeliefert und kann jetzt durch einfaches Ändern der Sicherheitseigenschaft "crypto.policy" gesteuert werden.
Unbegrenzt
→ Unbegrenzte Stärke (AES 256 kann auch verwendet werden)begrenzt
→ Grenzfestigkeit (kann wie bisher bis zu AES 128 verwendet werden)Die Sicherheitseigenschaft crypto.policy
kann auf zwei Arten festgelegt werden. Seit Java 9 ist sie jedoch standardmäßig ** unbegrenzt
, sodass Sie wirklich nichts tun müssen. da ist nicht.
Da es programmgesteuert festgelegt werden kann, ist es frei von der Ersetzung von Richtliniendateien und dem vorherigen Umschreiben von Einstellungen. Beachten Sie jedoch, dass das einmal initialisierte JCE-Framework nicht wie unten beschrieben in der Mitte umgeschaltet werden kann.
Security.setProperty("crypto.policy", "unlimited");
int length = Cipher.getMaxAllowedKeyLength("AES"); // => 2147483647
Security.setProperty("crypto.policy", "limited");
int length = Cipher.getMaxAllowedKeyLength("AES"); // => 128
Sie können auch "$ JAVA_HOME / conf / security / java.security" vorbearbeiten. Bitte beachten Sie, dass sich die Verzeichnishierarchie geringfügig von Java 8 unterscheidet
$ cd /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/conf/security/ #macOS Beispiel
$ tree
.
├── java.policy
├── java.security #In dieser Datei einstellen
├── javaws.policy
└── policy
├── README.txt
├── limited
│ ├── default_US_export.policy
│ ├── default_local.policy
│ └── exempt_local.policy
└── unlimited
├── default_US_export.policy
└── default_local.policy
$ grep "crypto.policy=" java.security
crypto.policy=unlimited
■ Nachtrag 2018-01-17 (thx. @Yehara) Von 8u161 wurde die Standardeinstellung in Java 8 in "unbegrenzt" geändert. Selbst in einer Java 8-Umgebung können Sie die AES 256-Verschlüsselung verwenden, indem Sie einfach auf das neueste JDK aktualisieren: Herzlichen Glückwunsch:
Bis zu diesem Punkt endet es mit "Ich möchte bald zu Java 9 gehen: müde:", aber tatsächlich gilt dieser Mechanismus auch für Java 8 8u151. Es ist in /javase/8u151-relnotes-3850493.html#JDK-8157561 enthalten. Dies bedeutet, dass Java 8-Benutzer jetzt die AES 256-Verschlüsselung verwenden können, indem sie einfach die Sicherheitseigenschaft "crypto.policy" festlegen.
Es gibt jedoch einige Unterschiede zu den Java 9-Spezifikationen. Beachten Sie daher die folgenden Punkte.
Sie können die Verschlüsselung mit unbegrenzter Stärke auf eine der folgenden Arten aktivieren:
Beachten Sie, dass es sich im Gegensatz zu Java 9 um "$ JAVA_HOME / jre / lib / security / java.security" handelt
$ cd /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/security/
$ tree
.
├── blacklist
├── blacklisted.certs
├── cacerts
├── java.policy
├── java.security #In dieser Datei einstellen
├── policy
│ ├── limited
│ │ ├── US_export_policy.jar
│ │ └── local_policy.jar
│ └── unlimited
│ ├── US_export_policy.jar
│ └── local_policy.jar
└── trusted.libraries
$ grep "crypto.policy=" java.security
# (equivalent to crypto.policy=limited)
#crypto.policy=unlimited
Als Referenz war bis zu 8u144 die folgende Verzeichnishierarchie
$ cd /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/
$ tree
.
├── US_export_policy.jar #Ersetzen Sie diese Datei
├── blacklist
├── blacklisted.certs
├── cacerts
├── java.policy
├── java.security
├── local_policy.jar #Ersetzen Sie diese Datei
└── trusted.libraries
Dies ist die Methode von 1., die programmgesteuert mit "Security.setProperty ()" festgelegt wird. Seien Sie jedoch vorsichtig, da sie in einigen Anwendungen nicht wie erwartet funktioniert. Der Punkt ist, dass es gesetzt werden muss **, bevor das JCE-Framework initialisiert wird.
Der folgende Code sieht beispielsweise gut aus, aber die Länge2 beträgt ebenfalls 128. Dies liegt daran, dass das JCE-Framework initialisiert wird, wenn die Cipher-Klasse zum ersten Mal referenziert wird, und an diesem Punkt entschieden wird, welche Richtlinie verwendet wird.
int length = Cipher.getMaxAllowedKeyLength("AES"); // => 128
Security.setProperty("crypto.policy", "unlimited");
int length2 = Cipher.getMaxAllowedKeyLength("AES"); // => 128 (!)
Es ist in Ordnung, wenn Sie ein einfaches Befehlszeilentool schreiben, aber es kann ein Problem für Webanwendungen sein, die beispielsweise auf Tomcat ausgeführt werden. Dies liegt daran, dass bei aktivierter HTTPS-Kommunikation das JCE-Framework initialisiert wird, bevor Ihr Anwendungscode ausgeführt wird.
Selbst in derselben Webanwendung befindet sich die Klasse mit der Hauptmethode als Einstiegspunkt auf der Anwendungsseite, wenn ein eingebetteter Container in Spring Boot usw. verwendet wird. Daher ist die Sicherheitseigenschaft in ihrer eigenen Klasse schneller als die Initialisierung des Containers. Kann ersetzt werden.
In diesem Artikel habe ich vorgestellt, dass das Ersetzen von Richtliniendateien, das beim Umgang mit AES 256-Kryptografie in Java erforderlich war, in Java 9 und Java 8 nicht mehr erforderlich ist.
Da es nicht mehr erforderlich ist, die Richtliniendatei im Voraus zu ersetzen, liegt es in der Natur des Menschen, die Methode zur Verwendung von "Security.setProperty ()" 1 zu wählen. In Java 8 wird jedoch der Anwendungstyp entwickelt Bitte beachten Sie, dass einige möglicherweise nicht funktionieren. Sie sollten schnell zu Java 9 wechseln, wo der Standardwert "unbegrenzt" ist.