Crittografia Java: memorizzazione delle chiavi
Le chiavi e i certificati utilizzati / generati vengono archiviati in un database denominato keystore. Per impostazione predefinita, questo database è archiviato in un file denominato.keystore.
È possibile accedere ai contenuti di questo database utilizzando il KeyStore classe di java.securitypacchetto. Questo gestisce tre diverse voci, ovvero PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
Memorizzazione di una chiave nel keystore
In questa sezione impareremo come memorizzare una chiave in un keystore. Per memorizzare una chiave nel 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 il getInstance() metodo come mostrato di seguito.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Passaggio 2: caricare l'oggetto KeyStore
Il load() Il metodo della classe KeyStore accetta un oggetto FileInputStream che rappresenta il file del 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);
Example
L'esempio seguente memorizza le chiavi nel keystore esistente nel file "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
Il programma di cui sopra genera il seguente output:
System.out.println("data stored");