Criptografía Java: recuperación de claves

En este capítulo, aprenderemos cómo recuperar una clave del almacén de claves utilizando criptografía Java.

Para recuperar una clave del almacén de claves, siga los pasos que se indican a continuación.

Paso 1: crear un objeto KeyStore

los getInstance() método del KeyStore clase de la java.security El paquete acepta un valor de cadena que representa el tipo de almacén de claves y devuelve un objeto Almacén de claves.

Cree un objeto de la clase KeyStore utilizando este método como se muestra a continuación.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Paso 2: Cargue el objeto KeyStore

los load() El método de la clase KeyStore acepta un FileInputStream objeto que representa el archivo de almacén de claves y un parámetro de cadena que especifica la contraseña del almacén de claves.

En general, el KeyStore se almacena en el archivo llamado cacerts, en la ubicación C:/Program Files/Java/jre1.8.0_101/lib/security/ y su contraseña predeterminada es changeit, cárguelo usando el load() método como se muestra a continuación.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Paso 3: Cree el objeto KeyStore.ProtectionParameter

Cree una instancia de KeyStore.ProtectionParameter como se muestra a continuación.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Paso 4: crea un objeto SecretKey

Crea el SecretKey (interfaz) objeto creando una instancia de su subclase SecretKeySpec. Mientras crea una instancia, debe pasar la contraseña y el algoritmo como parámetros a su constructor, como se muestra a continuación.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Paso 5: Cree un objeto SecretKeyEntry

Crea un objeto del SecretKeyEntry clase pasando el SecretKey objeto creado en el paso anterior como se muestra a continuación.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Paso 6: establezca una entrada en KeyStore

los setEntry() método del KeyStore La clase acepta un parámetro String que representa el alias de entrada del almacén de claves, un SecretKeyEntry object, un objeto ProtectionParameter y, almacena la entrada bajo el alias dado.

Establezca la entrada al almacén de claves mediante el setEntry() método como se muestra a continuación.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Paso 7: Cree el objeto KeyStore.SecretKeyEntry

los getEntry() El método de la clase KeyStore acepta un alias (parámetro String) y un objeto de la clase ProtectionParameter como parámetros y devuelve un KeyStoreEntry objeto, entonces puedes lanzarlo en KeyStore.SecretKeyEntry objeto.

Cree un objeto de la clase KeyStore.SecretKeyEntry pasando el alias de la clave requerida y el objeto de parámetro de protección creado en los pasos anteriores, al getEntry() método como se muestra a continuación.

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

Paso 8: crea el objeto clave de la entrada recuperada

los getSecretKey() método del SecretKeyEntryLa clase devuelve un objeto SecretKey. Con este método, cree un objeto SecretKey como se muestra a continuación.

//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
System.out.println(mysecretKey);

Ejemplo

El siguiente ejemplo muestra cómo recuperar claves de un almacén de claves. Aquí, almacenamos una clave en un almacén de claves, que está en el archivo "cacerts" (sistema operativo Windows 10), la recuperamos y mostramos algunas de sus propiedades, como el algoritmo utilizado para generar la clave y el formato de la clave recuperada.

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class RetrievingFromKeyStore{
   public static void main(String args[]) throws Exception{
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the the KeyStore object
      char[] password = "changeit".toCharArray();
      java.io.FileInputStream fis = new FileInputStream(
         "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
      
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      
      //Creating the KeyStore.SecretKeyEntry object
      SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

      //Creating SecretKey object
      SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
      System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());   
      System.out.println("Format used for the key: "+mysecretKey.getFormat());
   }
}

Salida

El programa anterior genera la siguiente salida:

Algorithm used to generate key: DSA
Format of the key: RAW