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:
- Cryptographie Java
- Chiffrement Java
- Messagedigest
- Mac
- Signature
- Keypair
- Générateur de clés
- KeyPairGenerator
- Keystore
- Keytool
- Attestation
- CertificateFactory
- 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); }