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");