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