Criptografía Java: almacenamiento de claves

Las claves y certificados utilizados / generados se almacenan en una base de datos denominada almacén de claves. De forma predeterminada, esta base de datos se almacena en un archivo llamado.keystore.

Puede acceder al contenido de esta base de datos utilizando el KeyStore clase de la java.securitypaquete. Esto gestiona tres entradas diferentes, a saber, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Almacenamiento de una clave en el almacén de claves

En esta sección, aprenderemos cómo almacenar una clave en un almacén de claves. Para almacenar una clave en el 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 el getInstance() 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 objeto FileInputStream que representa el archivo del almacén de claves y un parámetro String 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);

Example

El siguiente ejemplo almacena claves en el almacén de claves existente en el archivo "cacerts" (sistema operativo Windows 10).

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

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

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

      //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);
      
      //Creating the KeyStore.ProtectionParameter object
      KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.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);
      System.out.println("data stored");
   }
}

Output

El programa anterior genera la siguiente salida:

System.out.println("data stored");