Kryptographie in Java. KeyStore-Klasse

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:


  1. Java-Kryptographie
  2. Java-Chiffre
  3. Messagedigest
  4. Mac
  5. Unterschrift
  6. Schlüsselpaar
  7. Schlüsselgenerator
  8. KeyPairGenerator
  9. Keystore
  10. Keytool
  11. Zertifikat
  12. CertificateFactory
  13. 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); } 

Source: https://habr.com/ru/post/de445786/


All Articles