Crittografia Java: recupero delle chiavi

In questo capitolo, impareremo come recuperare una chiave dal keystore utilizzando Java Cryptography.

Per recuperare una chiave dal keystore, seguire i passaggi indicati di seguito.

Passaggio 1: creare un oggetto KeyStore

Il getInstance() metodo del KeyStore classe di java.security package accetta un valore stringa che rappresenta il tipo di keystore e restituisce un oggetto KeyStore.

Crea un oggetto della classe KeyStore utilizzando questo metodo come mostrato di seguito.

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

Passaggio 2: caricare l'oggetto KeyStore

Il load() metodo della classe KeyStore accetta un file FileInputStream oggetto che rappresenta il file keystore e un parametro String che specifica la password del KeyStore.

In generale, il KeyStore è memorizzato nel file denominato cacerts, nella posizione C:/Program Files/Java/jre1.8.0_101/lib/security/ e la sua password predefinita è changeit, caricalo utilizzando il file load() metodo come mostrato di seguito.

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

Passaggio 3: creare l'oggetto KeyStore.ProtectionParameter

Crea un'istanza di KeyStore.ProtectionParameter come mostrato di seguito.

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

Passaggio 4: creare un oggetto SecretKey

Crea il file SecretKey oggetto (interfaccia) istanziando la sua classe Sub SecretKeySpec. Durante la creazione dell'istanza è necessario passare password e algoritmo come parametri al suo costruttore, come mostrato di seguito.

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

Passaggio 5: creare un oggetto SecretKeyEntry

Crea un oggetto di SecretKeyEntry class passando il SecretKey oggetto creato nel passaggio precedente come mostrato di seguito.

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

Passaggio 6: impostare una voce nel KeyStore

Il setEntry() metodo del KeyStore class accetta un parametro String che rappresenta l'alias della voce del keystore, a SecretKeyEntry object, un oggetto ProtectionParameter e, memorizza la voce con l'alias specificato.

Impostare la voce nel keystore utilizzando il setEntry() metodo come mostrato di seguito.

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

Passaggio 7: creare l'oggetto KeyStore.SecretKeyEntry

Il getEntry() metodo della classe KeyStore accetta un alias (parametro String) e un oggetto della classe ProtectionParameter come parametri e restituisce un KeyStoreEntry oggetto, quindi puoi lanciarlo in esso KeyStore.SecretKeyEntry oggetto.

Creare un oggetto della classe KeyStore.SecretKeyEntry passando l'alias per la chiave richiesta e l'oggetto del parametro di protezione creato nei passaggi precedenti, al getEntry() metodo come mostrato di seguito.

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

Passaggio 8: creare l'oggetto chiave della voce recuperata

Il getSecretKey() metodo del SecretKeyEntryclass restituisce un oggetto SecretKey. Utilizzando questo metodo creare un oggetto SecretKey come mostrato di seguito.

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

Esempio

L'esempio seguente mostra come recuperare le chiavi da un archivio chiavi. Qui, memorizziamo una chiave in un keystore, che si trova nel file "cacerts" (sistema operativo Windows 10), la recuperiamo e visualizziamo alcune delle sue proprietà come l'algoritmo utilizzato per generare la chiave e, il formato la chiave recuperata.

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());
   }
}

Produzione

Il programma di cui sopra genera il seguente output:

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