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