Cryptographie en Java. Classe KeyStore

Bonjour, Habr! Je vous présente la traduction de l'article 9 du "Java KeyStore" par Jakob Jenkov à partir d'une série d'articles pour les débutants qui souhaitent apprendre les bases de la cryptographie en Java.


Table des matières:


  1. Cryptographie Java
  2. Chiffrement Java
  3. Messagedigest
  4. Mac
  5. Signature
  6. Keypair
  7. Générateur de clés
  8. KeyPairGenerator
  9. Keystore
  10. Keytool
  11. Attestation
  12. CertificateFactory
  13. CertPath

Keystore


Java KeyStore est un magasin de clés de type base de données représenté par la classe KeyStore ( java.security.KeyStore ). Le stockage peut être écrit sur le disque et relu, il peut être protégé par mot de passe et chaque enregistrement de clé dans le magasin de clés peut être protégé avec son propre mot de passe, ce qui fait de la classe KeyStore un mécanisme utile pour travailler en toute sécurité avec les clés de chiffrement. Un magasin de clés peut contenir des clés des types suivants:


  • ClĂ©s privĂ©es
  • ClĂ©s publiques et certificats (ClĂ©s publiques + certificats)
  • ClĂ©s secrètes

Les clés privées et publiques sont utilisées dans le chiffrement asymétrique. La clé publique peut avoir un certificat associé. Un certificat est un document prouvant l'identité d'une personne, d'une organisation ou d'un appareil prétendant posséder une clé publique. Le certificat est généralement signé numériquement par la partie utilisatrice comme preuve. Les clés privées sont utilisées dans le chiffrement symétrique. Dans la plupart des cas, lors de la configuration d'une connexion sécurisée, les clés symétriques sont inférieures aux clés asymétriques, vous stockerez donc le plus souvent des clés publiques et privées dans le magasin de clés.


Création d'un magasin de clés


Vous pouvez créer une instance de KeyStore en appelant sa méthode getInstance() . Voici un exemple de création d'une instance d'une classe:


 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

Cet exemple crée une instance KeyStore par défaut. Vous pouvez également créer des instances KeyStore avec un format de stockage de clé différent en passant un paramètre à la méthode getInstance() . Par exemple, création d'une instance du magasin de PKCS12 :


 KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

Télécharger le magasin de clés


Avant de pouvoir utiliser une instance d'un magasin de clés, vous devez la télécharger. Les instances de la classe KeyStore souvent écrites sur disque ou autre stockage pour une utilisation ultérieure, car la classe KeyStore suppose que vous devez lire ses données avant de pouvoir les utiliser. Cependant, vous pouvez initialiser une instance KeyStore vide sans données, comme vous le verrez plus tard.


Les données sont chargées à partir d'un fichier ou d'un autre stockage en appelant la méthode load() , qui prend deux paramètres:


  • InputStream partir duquel les donnĂ©es seront chargĂ©es.
  • char[] Un tableau de caractères contenant le mot de passe du magasin de clĂ©s.

Voici un exemple de chargement d'un magasin de clés:


 char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); } 

Cet exemple charge le fichier de clés keystore.ks. Si vous ne souhaitez pas charger de données dans le magasin de clés, passez simplement null pour le paramètre InputStream . Voici à quoi ressemble le chargement d'un magasin de clés vide:


 keyStore3.load(null, keyStorePassword); 

Une instance de la classe KeyStore toujours être chargée avec des données ou null . Sinon, le fichier de clés n'est pas initialisé et tous les appels à ses méthodes lèveront des exceptions.


Réception des clés


Vous pouvez obtenir les clés d'une instance de la classe KeyStore via sa méthode getEntry() . L'enregistrement de fichier de clés est mappé à un alias qui identifie la clé et est protégé par mot de passe. Ainsi, pour accéder à la clé, vous devez transmettre l'alias de clé et le mot de passe à la méthode getEntry() . Voici un exemple d'accès en écriture à une instance de KeyStore :


 char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword); 

Si vous savez que l'enregistrement auquel vous souhaitez accéder est la clé privée, vous pouvez convertir l'instance de KeyStore.Entry en KeyStore.PrivateKeyEntry . Voici à quoi ça ressemble:


 KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword); 

Après la KeyStore.PrivateKeyEntry en KeyStore.PrivateKeyEntry vous pouvez accéder à la clé privée, au certificat et à la chaîne de certificats à l'aide des méthodes suivantes:


  • getPrivateKey()
  • getCertificate()
  • getCertificateChain()

Stockage des clés


Vous pouvez également placer des clés dans une instance de la classe KeyStore . Un exemple de placement d'une clé secrète (clé symétrique) dans une instance de KeyStore :


 SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword); 

Stockage


Parfois, vous souhaiterez peut-être enregistrer le fichier de clés sur une sorte de stockage (disque, base de données, etc.) afin de pouvoir le recharger une autre fois. Une instance de la classe KeyStore enregistrée en appelant la méthode store() . Un exemple:


 char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); } 

Source: https://habr.com/ru/post/fr445786/


All Articles