Cryptographie Java - Récupération des clés

Dans ce chapitre, nous allons apprendre à récupérer une clé du keystore à l'aide de la cryptographie Java.

Pour récupérer une clé du 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 cette méthode comme indiqué ci-dessous.

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

Étape 2: chargez l'objet KeyStore

le load() méthode de la classe KeyStore accepte un FileInputStream objet 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);

Étape 7: Créez l'objet KeyStore.SecretKeyEntry

le getEntry() méthode de la classe KeyStore accepte un alias (paramètre String) et, un objet de la classe ProtectionParameter comme paramètres et retourne un KeyStoreEntry objet alors vous pouvez le lancer dans KeyStore.SecretKeyEntry objet.

Créez un objet de la classe KeyStore.SecretKeyEntry en passant l'alias de la clé requise et l'objet de paramètre de protection créé dans les étapes précédentes, au getEntry() méthode comme indiqué ci-dessous.

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

Étape 8: Créez l'objet clé de l'entrée récupérée

le getSecretKey() méthode de la SecretKeyEntryclass renvoie un objet SecretKey. À l'aide de cette méthode, créez un objet SecretKey comme indiqué ci-dessous.

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

Exemple

L'exemple suivant montre comment récupérer des clés à partir d'un magasin de clés. Ici, nous stockons une clé dans un keystore, qui se trouve dans le fichier «cacerts» (système d'exploitation Windows 10), la récupérons et affichons certaines de ses propriétés telles que l'algorithme utilisé pour générer la clé et, le format de la clé récupérée.

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

Production

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

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