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