Beispiel: Schlüssel- oder Schlüsselpaargenerierungsklasse für automatisierte Schlüsselgenerierung entwickeln

Eine Klasse, die Schlüssel für Verschlüsselungsoperationen generiert, kann automatisch erstellt werden. Mit dieser Funktion kann die Schlüsselverwaltungsinfrastruktur für einen vordefinierten Schlüsselsatz eine Liste von Schlüsseln verwalten, auf die Anwendungen zugreifen können.

Die Generierung neuer Schlüssel kann in vordefinierten Abständen eingeplant werden. Denken Sie daran, dass die Häufigkeit der Schlüsselgenerierung die Sicherheit Ihrer Daten beeinflusst. Für persistente Daten könnten Sie beispielsweise weniger häufig eine Schlüsselgenerierung einplanen als für die Kommunikation in Echtzeit, die aufgrund des Verfalls alter Schlüssel eine häufigere Generierung von Schlüsseln erfordert.

Wenn Sie eine Schlüsselgenerierungsklasse entwickeln, müssen Sie entscheiden, ob ein gemeinsam genutzter Schlüssel oder ein Schlüsselpaar erstellt werden soll. Von dieser Entscheidung hängt die zu verwendende Schnittstelle ab.

Falls Sie gemeinsam genutzte Schlüssel entwickeln möchten, schauen Sie sich das folgende Beispiel an, das mit der Klasse "KeyGenerator" die Schnittstelle "com.ibm.websphere.crypto.KeyGenerator" implementiert. Die Schnittstelle gibt einen java.security.Key-Schlüssel zurück, der in einem Keystore vom Typ JCEKS als SecretKey gespeichert wird. Sie können auch einen anderen Keystore-Typ verwenden, der das Speichern geheimer Schlüssel unterstützt.

package com.ibm.test;

import java.util.*;
import com.ibm.ws.ssl.core.*;
import com.ibm.ws.ssl.config.*;
import com.ibm.websphere.crypto.KeyException;

public class KeyGenerator implements com.ibm.websphere.crypto.KeyGenerator
{
    private java.util.Properties customProperties = null;
    private java.security.Key secretKey = null;

    public KeyGenerator()
    {
    }

     /**
      * Diese Methode wird aufgerufen, um alle mit KeySet konfigurierten angepassten
      * Eigenschaften an die Implementierung dieser Schnittstelle zu übergeben.
      *
      * @param java.util.Properties
      **/
    public void init (java.util.Properties customProps)
    {
        customProperties = customProps;
    }

     /**
      * Diese Methode wird immer aufgerufen, wenn ein Schlüssel nach Zeitplan
      * oder auf manuelle Anforderung generiert werden muss. Der Schlüssel wird
      * in dem Keystore gespeichert, der von dem konfigurierten Schlüsselsatz mit der
      * keyGenerationClass referenziert wird, die diese Schnittstelle implementiert. Die
      * Implementierung dieser Schnittstelle verwaltet den Schlüsseltyp. Der Benutzer des
      * Schlüsselsatzes muss den von dieser keyGenerationClass zurückgegebenen Typ kennen.
      *
      * @return java.security.Key
      * @throws com.ibm.websphere.crypto.KeyException
      **/
    public java.security.Key generateKey () throws KeyException
    {
        try 
        {
            // Voraussetzung: generate3DESKey ist vorhanden, um den Schlüssel zu erstellen.
            byte[] tripleDESKey = generate3DESKey();
            secretKey = new javax.crypto.spec.SecretKeySpec(tripleDESKey, 0, 24, "3DES");
            
            if (secretKey != null)
            {
                return secretKey;
            }
            else 
            {
                throw new com.ibm.websphere.crypto.KeyException ("Key could not be generated.");
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();  // Ausnahme behandeln
        }
    }
}

Falls Sie ein Schlüsselpaar entwickeln möchten, schauen Sie sich das folgende Beispiel an, das mit der Klasse "KeyPairGenerator" die Schnittstelle "com.ibm.websphere.crypto.KeyPairGenerator" implementiert.

package com.ibm.test;

import java.util.*;
import javax.crypto.spec.SecretKeySpec;
import com.ibm.websphere.crypto.KeyException;

/**
 * Diese Implementierung definiert die Methode für das Generieren eines java.security.KeyPair.
 * Wenn eine keyGeneration-Klasse diese Methode implementiert, wird die Methode generateKeyPair
 * aufgerufen und ein Schlüsselpaar im Keystore gespeichert. Das Attribut isKeyPair wird
 * ignoriert, weil die KeyGenerationClass eine Implementierung von KeyPairGenerator ist.
 * Die isKeyPair-Attribute werden benötigt, wenn die Schlüssel bereits in einem Keystore
 * enthalten sind und nur gelesen (aber nicht generiert) werden.
 * 
 * @author IBM Corporation
 * @version WebSphere Application Server 6.1
 * @since WebSphere Application Server 6.1
 **/
public class KeyPairGenerator implements com.ibm.websphere.crypto.KeyPairGenerator
{
    private java.util.Properties customProperties = null;

    public KeyPairGenerator()
    {
    }

     /**
      * Diese Methode wird aufgerufen, um alle mit KeySet konfigurierten angepassten
      * Eigenschaften an die Implementierung dieser Schnittstelle zu übergeben.
     *
      * @param java.util.Properties
      **/
    public void init (java.util.Properties customProps)
    {
        customProperties = customProps;
    }

     /**
      * Diese Methode wird immer aufgerufen, wenn ein Schlüssel nach Zeitplan
      * oder auf manuelle Anforderung generiert werden muss und isKeyPair=true in
      * der Schlüsselsatzkonfiguration enthalten ist. Der Schlüssel wird in
      * dem Keystore gespeichert, der von dem konfigurierten Schlüsselsatz mit der
      * keyGenerationClass referenziert wird, die diese Schnittstelle implementiert.
      * Die Implementierung dieser Schnittstelle verwaltet den Typ des Schlüssels.
      * Der Benutzer des Schlüsselsatzes muss den von dieser keyGenerationClass
      * zurückgegebenen Typ kennen.
      *
      * @return com.ibm.websphere.crypto.KeyPair
      * @throws com.ibm.websphere.crypto.KeyException
      **/
    public com.ibm.websphere.crypto.KeyPair generateKeyPair () throws KeyException
    {
        try 
        {
            java.security.KeyPair keyPair = generateKeyPair();
            
            // als SecretKeySpec speichern
            if (keyPair != null)
            {
                java.security.PrivateKey privKey = keyPair.getPrivate();
                java.security.PublicKey pubKey = keyPair.getPublic();

                SecretKeySpec publicKeyAsSecretKey = new SecretKeySpec (pubKey.getEncoded(), "RSA_PUBLIC");
                SecretKeySpec privateKeyAsSecretKey = new SecretKeySpec (privKey.getEncoded(), "RSA_PRIVATE");

                com.ibm.websphere.crypto.KeyPair pair = new 	
								com.ibm.websphere.crypto.KeyPair(publicKeyAsSecretKey, privateKeyAsSecretKey);
                return pair;
            }
            else 
            {
                throw new com.ibm.websphere.crypto.KeyException ("Key pair could not be generated.");
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();  // Ausnahme behandeln
        }
    }
}

Diese Schnittstelle gibt ein com.ibm.websphere.crypto.KeyPair-Schlüsselpaar zurück, das ein X509Certificate- und ein PrivateKey-Objekt oder PublicKey- und PrivateKey-Objekte enthalten kann. Wenn die Schnittstelle "com.ibm.websphere.crypto.KeyPair" ein X509Certificate- und ein PrivateKey-Objekt enthält, werden das Zertifikat und der private Schlüssel im Keystore gespeichert. Sie können demzufolge einen beliebigen Keystore-Typ verwenden.

Enthält die Schnittstelle "com.ibm.websphere.crypto.KeyPair" PublicKey- und PrivateKey-Objekte, müssen Sie die codierten Werte in das SecretKeySpec-Objekt konvertieren, um sie speichern zu können. Die Laufzeit von WebSphere Application Server speichert das Schlüsselpaar als geheime Schlüssel und ruft es auch als geheime Schlüssel ab. Die Laufzeit konvertiert das Schlüsselpaar wieder in PublicKey- und PrivateKey-Objekte, wenn der Server das Paar während des Handshake abruft.

Verwenden Sie zum Entwickeln der Schnittstelle "com.ibm.websphere.crypto.KeyPair" die folgenden Konstruktoren:
  • public und private
    public KeyPair(java.security.Key publicKey, java.security.Key privateKey)
  • certificate und private
    public KeyPair(java.security.cert.Certificate[] certChain, 
    java.security.Key privateKey)

Der obige Beispielcode zeigt die Klasse KeyPairGenerator, die den Konstruktor der Typen public und private verwendet. Bei jedem Aufruf dieser Klasse wird ein neues eindeutiges Schlüsselpaar generiert. Diese Klasse wird von einem Schlüsselsatz aufgerufen, um ein neues Schlüsselpaar zu erstellen, wenn isKeyPair=true gesetzt ist. Die Versionsnummer im Schlüsselsatz wird bei jedem Aufruf um eins erhöht.


Symbol, das den Typ des Artikels anzeigt. Referenzartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rsec_ssldevkeypairgen
Dateiname:rsec_ssldevkeypairgen.html