Guía de desarrollo

Local Navigation

Almacén de claves

Un almacén de claves es una recopilación de registros KeyStoreData. Un registro KeyStoreData contiene datos como claves públicas, claves privadas, claves simétricas, certificados, un identificador del registro KeyStoreData, y otros elementos.

Cada uno de los smartphones BlackBerry dispone de un almacén de claves precargado, que incluye certificados raíz para varias autoridades de certificación. Estos certificados raíz de confianza constituyen la base de todas las cadenas posteriores de confianza. Los usuarios de smartphoneS pueden personalizar su almacén de claves. Por ejemplo, pueden decidir si desean que se les solicite la contraseña cada vez que se acceda al almacén de claves.

La funcionalidad para crear y administrar los almacenes de claves, incluidos algunos almacenes de claves predefinidos, viene incluida en el paquete net.rim.device.api.crypto.keystore.KeyStore. El paquete KeyStore proporciona un modelo de almacén de claves que le permite administrar la distribución y el acceso de las mismas tanto en el ordenador como en el smartphone. El paquete KeyStore contiene las siguientes clases:

  • La clase RIMKeyStore se proporciona como una implementación predeterminada. Sólo almacena claves hasta que el smartphone se reinicia, por lo que no puede utilizarse para almacenar claves permanentes. Un ejemplo de su uso es el almacenamiento de claves de tarjetas inteligentes: en estos casos, las claves se almacenan siempre en la tarjeta, por lo que no es necesario que el almacén de claves sea permanente. Los siguientes almacenes de claves son variantes de esta clase:

    • La clase PersistableRIMKeyStore resulta útil en aquellos casos en los que sea necesario mantener las claves a pesar de que el smartphone se reinicie.
    • La clase SyncableRIMKeyStore resulta útil en aquellos casos en los que sea necesario mantener las claves a pesar de que el smartphone se reinicie y permite, además, al usuario del smartphone sincronizar las claves mediante la herramienta de sincronización de certificados de BlackBerry Desktop Manager (para BlackBerry Desktop Manager 5 y anterior).
  • La clase TrustedKeyStore proporciona un almacenamiento muy seguro para claves con un nivel de seguridad muy alto. Sólo podrán agregar claves al almacén de claves TrustedKeyStore las aplicaciones firmadas.

  • El almacén de claves DeviceKeyStore proporciona la funcionalidad necesaria para llevar a cabo la sincronización con Desktop Software.

  • El almacén de claves CombinedKeyStore le permite combinar varios almacenes en uno solo.

Ejemplo de código: crear un almacén de claves

El siguiente ejemplo de código crea un nuevo almacén de claves denominado"My keystore" y un par de claves denominado keyPair. Se crea un objeto associatedData con el fin de contribuir al proceso posterior de recuperación de claves del almacén.

RIMKeyStore keyStore = new RIMKeyStore("My Keystore");
DSAKeyPair keyPair = new DSAKeyPair( new DSACryptoSystem() );
AssociatedData associatedData = 
   new AssociatedData( AssociatedData.EMAIL, "user01@example.com".getBytes() );

El siguiente ejemplo de código agrega keyPair al almacén de claves. El método set agrega un objeto KeyStoreData que contiene información que se asociará a la matriz de alias incluidos en la clase. Se llama al método keyStore.set con ocho parámetros:

  • El objeto AssociatedData (una matriz de datos asociada que contiene los alias utilizados para indexar este registro en el almacén de claves).

  • Una etiqueta ("Crypto Signing Key") que identifica la clave.

  • La clave privada.

  • El algoritmo de codificación de la clave privada. En este caso, está establecido en null, por lo que se utiliza el formato predeterminado PKCS8.

  • Un nivel de seguridad bajo para la clave, lo que significa que en aquellos casos en los que un usuario intente acceder a la clave privada, el sistema no le solicitará que introduzca ninguna contraseña.

  • La clave pública.

  • La configuración de KeyUsage (en este caso, dicha configuración especificará que la función de la clave pública es la protección del correo electrónico y el acuerdo de claves).
  • El pase, que en este caso es null.

Se utiliza un bloque try/catch para capturar cualquier excepción que pueda producirse.

try 
{
    keyStore.set( new AssociatedData[] {associatedData}, "Crypto Signing Key", 
                  keyPair.getDSAPrivateKey(), null, KeyStore.SECURITY_LEVEL_LOW,
                  keyPair.getDSAPublicKey(), 
                  KeyUsage.EMAIL_PROTECTION | KeyUsage.KEY_AGREEMENT, null );
}
catch( NoSuchAlgorithmException e ) 
{
} 
catch( KeyStoreCancelException e ) 
{
    return;
} 
catch( InvalidKeyEncodingException e ) 
{
} 
catch( CryptoTokenException e ) 
{
} 
catch( InvalidKeyException e ) 
{
} 
catch( CryptoUnsupportedOperationException e ) 
{
}

El siguiente ejemplo de código recupera la clave denominada keyPair del almacén de claves. En primer lugar, el código crea un índice. Sólo debe agregar un índice a un almacén de claves una única vez. Anteriormente, en este mismo ejemplo, se asoció un objeto AssociatedData con la dirección correo electrónico user01@example.com, por lo que el nuevo índice es del tipo AssociatedDataKeyStoreIndex. El índice se agrega al almacén de claves. A continuación, se utiliza el método KeyStore.elements para recuperar la clave. El método elements utiliza el índice (index.getID) y los bytes asociados al objeto AssociatedData ("user01@example.com".getBytes). El método elements devuelve una lista de todos los objetos KeyStoreData que coinciden con los criterios de la búsqueda. Se utiliza un bucle while para buscar en la lista la etiqueta "Crypto Signing Key". (En una aplicación real, puede que haya dos claves con la misma información AssociatedData y etiqueta, por lo que debe solicitar al usuario que determine qué clave debe recuperarse). Para recuperar la clave, se llama al método getPrivateKey. Al no existir ningún pase, se utiliza el parámetro null.

AssociatedDataKeyStoreIndex index = 
        new AssociatedDataKeyStoreIndex( AssociatedData.EMAIL );
keyStore.addIndex( index );
Enumeration enum = 
        keyStore.elements( index.getID(), "user01@example.com".getBytes() );
KeyStoreData data = null;
PrivateKey privateKey = null;
while( enum.hasMoreElements() ) 
    {
    data = (KeyStoreData)enum.nextElement();
    if( "Crypto Signing Key".equals( data.getLabel() ) ) 
          {
          try 
               {
               privateKey = data.getPrivateKey( null );
               } 
          catch( NoSuchAlgorithmException e ) 
          {
          } 
          catch( KeyStoreCancelException e ) 
          {
          } 
          catch( InvalidKeyEncodingException e ) 
          {
          } 
          catch( CryptoTokenException e ) 
          {
          } 
          catch( CryptoUnsupportedOperationException e ) 
          {
          } 
          catch( KeyStoreDecodeException e ) 
          {
          }
     }
}

El siguiente ejemplo de código agrega un certificado al almacén de claves y, a continuación, comprueba la existencia del certificado. Este ejemplo de código presupone que cuenta con un certificado WTLS.

El primer parámetro del método keyStore.set es una matriz que contiene los alias necesarios para indexar este registro en el almacén de claves. Al ofrecer esta información, podrá realizar consultas al certificado con el alias que especifique, tal y como se muestra en el ejemplo anterior. No obstante, en este ejemplo, el parámetro se establece en null, el certificado se coloca en el almacén de claves y, a continuación, se llama a keyStore.isMember() para comprobar la suscripción. El método isMember crea un índice para el certificado.

byte[] certData = { /* Certificate data as a byte array */ };
try 
    {
    //Assuming that you have a WTLS certificate, create a WTLS certificate.
    WTLSCertificate cert = WTLSCertificate( certData );
    keyStore.set(null, "my certificate", cert, new CertificateStatus(), null);
    ...
} 
catch ( CertificateParsingException e ) 
{
} 
catch ( NoSuchAlgorithmException e ) 
{
} 
catch ( InvalidKeyEncodingException e ) 
{
} 
catch ( InvalidKeyException e ) 
{
} 
catch ( CryptoTokenException e ) 
{
} 
catch ( CryptoUnsupportedOperationException e ) 
{
} 
catch ( KeyStorePasswordException e ) 
{
}
//Verify that the certificate is in the key store.
WTLSCertificate myNewCert = WTLSCertificate( certData );
if ( keyStore.isMember(myNewCert) ) 
     {
     System.out.println("Certificate provided is in the key store");
     }
else 
     {
     System.out.println("Certificate provided is not in the key store");
     }
Tema siguiente: Acuerdo de claves
Tema anterior: Claves

¿Le ha resultado útil esta información? Envíenos sus comentarios.