Hallo Habr! Ich präsentiere Ihnen die Übersetzung von Artikel 9 des "Java KeyStore" von Jakob Jenkov aus einer Reihe von Artikeln für Anfänger , die die Grundlagen der Kryptographie in Java erlernen möchten.
Inhaltsverzeichnis:
- Java-Kryptographie
- Java-Chiffre
- Messagedigest
- Mac
- Unterschrift
- Schlüsselpaar
- Schlüsselgenerator
- KeyPairGenerator
- Keystore
- Keytool
- Zertifikat
- CertificateFactory
- CertPath
Keystore
Java KeyStore ist ein Schlüsselspeicher im Datenbankstil, der von der KeyStore-Klasse ( java.security.KeyStore ) bereitgestellt wird. Der Speicher kann auf die Festplatte geschrieben und erneut gelesen werden, er kann durch ein Kennwort geschützt werden, und jeder Schlüsseldatensatz im Schlüsselspeicher kann mit einem eigenen Kennwort geschützt werden. KeyStore
macht die KeyStore
Klasse zu einem nützlichen Mechanismus für die sichere Arbeit mit Verschlüsselungsschlüsseln. Ein Schlüsselspeicher kann Schlüssel der folgenden Typen enthalten:
- Private Schlüssel
- Öffentliche Schlüssel und Zertifikate (Öffentliche Schlüssel + Zertifikate)
- Geheime Schlüssel
Private und öffentliche Schlüssel werden bei der asymmetrischen Verschlüsselung verwendet. Dem öffentlichen Schlüssel kann ein Zertifikat zugeordnet sein. Ein Zertifikat ist ein Dokument, das die Identität einer Person, Organisation oder eines Geräts nachweist, die / das behauptet, einen öffentlichen Schlüssel zu besitzen. Das Zertifikat wird in der Regel von der vertrauenden Partei als Nachweis digital signiert. Private Schlüssel werden bei der symmetrischen Verschlüsselung verwendet. In den meisten Fällen sind beim Einrichten einer sicheren Verbindung symmetrische Schlüssel asymmetrischen Schlüsseln unterlegen, sodass Sie in den meisten Fällen öffentliche und private Schlüssel im Schlüsselspeicher speichern.
Erstellen eines Keystores
Sie können eine Instanz von KeyStore
indem Sie die Methode getInstance()
aufrufen. Hier ist ein Beispiel zum Erstellen einer Instanz einer Klasse:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
In diesem Beispiel wird eine Standard- KeyStore
Instanz erstellt. Sie können KeyStore-Instanzen auch mit einem anderen Schlüsselspeicherformat erstellen, indem Sie einen Parameter an die Methode getInstance()
. Beispiel: Erstellen einer Instanz des PKCS12
Keystores:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
Laden Sie den Keystore herunter
Bevor Sie eine Instanz eines Keystores verwenden können, müssen Sie ihn herunterladen. Instanzen der KeyStore
Klasse KeyStore
häufig zur späteren Verwendung auf die Festplatte oder einen anderen Speicher geschrieben, da die KeyStore
Klasse davon ausgeht, dass Sie ihre Daten lesen müssen, bevor Sie sie verwenden können. Sie können jedoch eine leere KeyStore
Instanz ohne Daten initialisieren, wie Sie später sehen werden.
Daten werden aus einer Datei oder einem anderen Speicher geladen, indem die load()
-Methode aufgerufen wird, die zwei Parameter akzeptiert:
InputStream
von dem Daten geladen werden.char[]
Ein Array von Zeichen, die das Kennwort aus dem Keystore enthalten.
Hier ist ein Beispiel für das Laden eines Schlüsselspeichers:
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
In diesem Beispiel wird die Keystore-Datei keystore.ks geladen. Wenn Sie keine Daten in den Schlüsselspeicher laden möchten, übergeben Sie einfach null
für den Parameter InputStream
. So sieht das Laden eines leeren Schlüsselspeichers aus:
keyStore3.load(null, keyStorePassword);
Eine Instanz der KeyStore
Klasse KeyStore
immer entweder mit Daten oder mit null
geladen werden. Andernfalls wird der Keystore nicht initialisiert, und alle Aufrufe seiner Methoden lösen Ausnahmen aus.
Schlüssel empfangen
Sie können die Schlüssel einer Instanz der KeyStore
Klasse über die Methode getEntry()
. Der Keystore-Datensatz wird einem Alias zugeordnet, der den Schlüssel identifiziert und kennwortgeschützt ist. Um auf den Schlüssel zugreifen zu können, müssen Sie daher den Schlüsselalias und das Kennwort an die Methode getEntry()
. Hier ist ein Beispiel für den Schreibzugriff auf eine Instanz von KeyStore
:
char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);
Wenn Sie wissen, dass der Datensatz, auf den Sie zugreifen möchten, der private Schlüssel ist, können Sie die Instanz von KeyStore.Entry
in KeyStore.PrivateKeyEntry
. So sieht es aus:
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword);
Nach dem Casting in KeyStore.PrivateKeyEntry
Sie mit den folgenden Methoden auf den privaten Schlüssel, das Zertifikat und die Zertifikatkette zugreifen:
getPrivateKey()
getCertificate()
getCertificateChain()
Schlüsselspeicher
Sie können Schlüssel auch in eine Instanz der KeyStore
Klasse KeyStore
. Ein Beispiel für das Platzieren eines geheimen Schlüssels (symmetrischer Schlüssel) in einer Instanz von KeyStore
:
SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);
Lagerung
Manchmal möchten Sie den Schlüsselspeicher möglicherweise in einem Speicher (Festplatte, Datenbank usw.) speichern, damit Sie ihn ein anderes Mal erneut laden können. Eine Instanz der KeyStore
Klasse KeyStore
durch Aufrufen der store()
-Methode gespeichert. Ein Beispiel:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }