Ejemplo: Desarrollo de una clase de generación de claves o de pares de claves para la generación de claves automatizada
Puede crear una clase que genere claves automáticamente para las operaciones criptográficas. Con este posibilidad, la infraestructura de gestión de claves puede mantener una lista de claves para un conjunto de claves definidas previamente y las aplicaciones pueden acceder a estas claves.
Puede planificar la generación de claves nuevas a frecuencias definidas previamente. Recuerde que la frecuencia de generación de claves afecta la seguridad de los datos. Por ejemplo, en los datos persistentes, puede planificar la generación de claves con menos frecuencia que para las comunicaciones en tiempo real, lo que requiere que las claves se generen con una frecuencia mayor a la frecuencia con que caducan las claves antiguas.
Cuando desarrolla una clase de generación de claves, decida si va a crear una clave compartida o un par de claves ya que esta decisión determina la interfaz que debe utilizar.
Si va a desarrollar claves compartidas, consulte el ejemplo siguiente, que utiliza la clase KeyGenerator para implementar la interfaz com.ibm.websphere.crypto.KeyGenerator. La interfaz devuelve una clave java.security.Key que se almacena como un SecretKey en un tipo de almacén de claves JCEKS. Puede utilizar cualquier otro tipo de almacén de claves que permita almacenar claves secretas.
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()
{
}
/**
* Se llama a este método para pasar a la implementación de esta interfaz
* cualquier propiedad personalizada configurada con el conjunto de claves.
*
* @param java.util.Properties
**/
public void init (java.util.Properties customProps)
{
customProperties = customProps;
}
/**
* Se llama a este método cuando se ha de generar una clave porque se ha planificado
* o se ha solicitado manualmente. La clave se almacena en el almacén de claves
* al que hace referencia el conjunto de claves configurado que contiene la
* keyGenerationClass que implementa esta interfaz. La implementación de esta
* interfaz gestiona el tipo de claves. El usuario del almacén de claves
* debe saber el tipo que devuelve esta keyGenerationClass.
*
* @return java.security.Key
* @throws com.ibm.websphere.crypto.KeyException
**/
public java.security.Key generateKey () throws KeyException
{
try
{
// Presuponga que generate3DESKey está presente para crear la clave.
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 ("No se ha podido generar la clave.");
}
}
catch (Exception e)
{
e.printStackTrace(); // handle exception
}
}
}
Si va a desarrollar un par de claves, consulte el ejemplo siguiente que utiliza la clase KeyPairGenerator para implementar la interfaz com.ibm.websphere.crypto.KeyPairGenerator.
package com.ibm.test;
import java.util.*;
import javax.crypto.spec.SecretKeySpec;
import com.ibm.websphere.crypto.KeyException;
/**
* Esta implementación define el método para generar java.security.KeyPair.
* Cuando una clase keyGeneration implementa este método, se llama al método generateKeyPair
* y se almacena un KeyPair en el almacén de claves. El atributo isKeyPair se ignora
* ya que KeyGenerationClass es una implementación
* de KeyPairGenerator. Los atributos isKeyPair son para cuando ya existen
* las claves en un almacén de claves y simplemente se leen y
* no se generan.
*
* @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()
{
}
/**
* Se llama a este método para pasar a la implementación de esta interfaz
* cualquier propiedad personalizada configurada con el conjunto de claves.
*
* @param java.util.Properties
**/
public void init (java.util.Properties customProps)
{
customProperties = customProps;
}
/**
* Se llama a este método cuando se ha de generar una clave porque se ha planificado
* o se ha solicitado manualmente y en la configuración del conjunto de claves
* isKeyPair=true. La clave se almacena en el almacén de claves al que hace referencia
* el KeySet configurado que contiene la keyGenerationClass que implementa
* esta interfaz. La implementación de esta interfaz gestiona el tipo
* de clave. El usuario del KeySet debe saber el tipo que devuelve
* esta keyGenerationClass.
*
* @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();
// Store as SecretKeySpec
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(); // handle exception
}
}
}
Esta interfaz devuelve un par de claves com.ibm.websphere.crypto.KeyPair que contienen un objeto X509Certificate y PrivateKey o los objetos PublicKey y PrivateKey. Si la interfaz com.ibm.websphere.crypto.KeyPair contiene el objeto aX509Certificate y PrivateKey, el certificado y la clave privada se almacenan en el almacén de claves. Por lo tanto, pueden utilizar cualquier tipo de almacén de claves.
Si la interfaz com.ibm.websphere.crypto.KeyPair contiene los objetos PublicKey y PrivateKey, debe convertir los valores codificados al objeto SecretKeySpec para poder almacenarlos. La ejecución de WebSphere Application Server almacena y recupera el par de claves como claves secretas. La ejecución vuelve a convertir el par de claves en los objetos PublicKey y PrivateKey cuando el servidor recupera el par durante el reconocimiento de comunicación.
- Constructor público y privado
public KeyPair(java.security.Key publicKey, java.security.Key privateKey)
- Constructor de certificados y claves privadas
public KeyPair(java.security.cert.Certificate[] certChain, java.security.Key privateKey)
El código de ejemplo anterior muestra la clase KeyPairGenerator utilizando el constructor de claves públicas y privadas. Cada llamada a esta clase genera un par de claves nuevo y exclusivo y esta clase la invoca un KeySet para crear un par de claves nuevo cuando isKeyPair=true. El número de versión del conjunto de claves incrementa con cada llamada.