Cryptographie Java - Stockage des clés

Les clés et certificats utilisés / générés sont stockés dans une base de données appelée keystore. Par défaut, cette base de données est stockée dans un fichier nommé.keystore.

Vous pouvez accéder au contenu de cette base de données en utilisant le KeyStore classe de la java.securitypaquet. Cela gère trois entrées différentes à savoir, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Stockage d'une clé dans le keystore

Dans cette section, nous allons apprendre à stocker une clé dans un keystore. Pour stocker une clé dans le keystore, suivez les étapes ci-dessous.

Étape 1: créer un objet KeyStore

le getInstance() méthode de la KeyStore classe de la java.security package accepte une valeur de chaîne représentant le type du keystore et renvoie un objet KeyStore.

Créez un objet de la classe KeyStore à l'aide de getInstance() méthode comme indiqué ci-dessous.

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

Étape 2: chargez l'objet KeyStore

le load() La méthode de la classe KeyStore accepte un objet FileInputStream représentant le fichier keystore et un paramètre String spécifiant le mot de passe du KeyStore.

En général, le KeyStore est stocké dans le fichier nommé cacerts, à l'emplacement C:/Program Files/Java/jre1.8.0_101/lib/security/ et son mot de passe par défaut est changeit, chargez-le en utilisant le load() méthode comme indiqué ci-dessous.

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

Étape 3: Créez l'objet KeyStore.ProtectionParameter

Instanciez le KeyStore.ProtectionParameter comme indiqué ci-dessous.

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

Étape 4: créer un objet SecretKey

Créer le SecretKey (interface) objet en instanciant sa sous-classe SecretKeySpec. Lors de l'instanciation, vous devez transmettre le mot de passe et l'algorithme en tant que paramètres à son constructeur, comme indiqué ci-dessous.

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

Étape 5: créer un objet SecretKeyEntry

Créez un objet du SecretKeyEntry classe en passant le SecretKey objet créé à l'étape ci-dessus comme indiqué ci-dessous.

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

Étape 6: définir une entrée dans le KeyStore

le setEntry() méthode de la KeyStore la classe accepte un paramètre String représentant l'alias d'entrée du keystore, un SecretKeyEntry object, un objet ProtectionParameter et, stocke l'entrée sous l'alias donné.

Définissez l'entrée dans le fichier de clés à l'aide du setEntry() méthode comme indiqué ci-dessous.

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

Example

L'exemple suivant stocke les clés dans le keystore existant dans le fichier «cacerts» (système d'exploitation 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

Le programme ci-dessus génère la sortie suivante -

System.out.println("data stored");