azure-security-keyvault-keys-java

Azure Key Vault Keys Java SDK pour la gestion des clés cryptographiques. À utiliser lors de la création, la gestion ou l'utilisation de clés RSA/EC, de l'exécution d'opérations encrypt/decrypt/sign/verify, ou du travail avec des clés sauvegardées par HSM.

npx skills add https://github.com/microsoft/skills --skill azure-security-keyvault-keys-java

Clés Azure Key Vault (Java)

Gérez les clés cryptographiques et effectuez des opérations cryptographiques dans Azure Key Vault et Managed HSM.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-security-keyvault-keys</artifactId>
    <version>4.9.0</version>
</dependency>

Création du client

import com.azure.security.keyvault.keys.KeyClient;
import com.azure.security.keyvault.keys.KeyClientBuilder;
import com.azure.security.keyvault.keys.cryptography.CryptographyClient;
import com.azure.security.keyvault.keys.cryptography.CryptographyClientBuilder;
import com.azure.identity.DefaultAzureCredentialBuilder;

// Client de gestion des clés
KeyClient keyClient = new KeyClientBuilder()
    .vaultUrl("https://<vault-name>.vault.azure.net")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

// Client asynchrone
KeyAsyncClient keyAsyncClient = new KeyClientBuilder()
    .vaultUrl("https://<vault-name>.vault.azure.net")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

// Client de cryptographie (pour encrypt/decrypt/sign/verify)
CryptographyClient cryptoClient = new CryptographyClientBuilder()
    .keyIdentifier("https://<vault-name>.vault.azure.net/keys/<key-name>/<key-version>")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

Types de clés

Type Description
RSA Clé RSA (2048, 3072, 4096 bits)
RSA_HSM Clé RSA dans HSM
EC Clé de courbe elliptique
EC_HSM Clé de courbe elliptique dans HSM
OCT Clé symétrique (Managed HSM uniquement)
OCT_HSM Clé symétrique dans HSM

Créer des clés

Créer une clé RSA

import com.azure.security.keyvault.keys.models.*;

// Clé RSA simple
KeyVaultKey rsaKey = keyClient.createRsaKey(new CreateRsaKeyOptions("my-rsa-key")
    .setKeySize(2048));

System.out.println("Key name: " + rsaKey.getName());
System.out.println("Key ID: " + rsaKey.getId());
System.out.println("Key type: " + rsaKey.getKeyType());

// Clé RSA avec options
KeyVaultKey rsaKeyWithOptions = keyClient.createRsaKey(new CreateRsaKeyOptions("my-rsa-key-2")
    .setKeySize(4096)
    .setExpiresOn(OffsetDateTime.now().plusYears(1))
    .setNotBefore(OffsetDateTime.now())
    .setEnabled(true)
    .setKeyOperations(KeyOperation.ENCRYPT, KeyOperation.DECRYPT, 
                       KeyOperation.WRAP_KEY, KeyOperation.UNWRAP_KEY)
    .setTags(Map.of("environment", "production")));

// Clé RSA supportée par HSM
KeyVaultKey hsmKey = keyClient.createRsaKey(new CreateRsaKeyOptions("my-hsm-key")
    .setKeySize(2048)
    .setHardwareProtected(true));

Créer une clé EC

// Clé EC avec courbe P-256
KeyVaultKey ecKey = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key")
    .setCurveName(KeyCurveName.P_256));

// Clé EC avec d'autres courbes
KeyVaultKey ecKey384 = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key-384")
    .setCurveName(KeyCurveName.P_384));

KeyVaultKey ecKey521 = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key-521")
    .setCurveName(KeyCurveName.P_521));

// Clé EC supportée par HSM
KeyVaultKey ecHsmKey = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-hsm-key")
    .setCurveName(KeyCurveName.P_256)
    .setHardwareProtected(true));

Créer une clé symétrique (Managed HSM uniquement)

KeyVaultKey octKey = keyClient.createOctKey(new CreateOctKeyOptions("my-symmetric-key")
    .setKeySize(256)
    .setHardwareProtected(true));

Obtenir une clé

// Obtenir la dernière version
KeyVaultKey key = keyClient.getKey("my-key");

// Obtenir une version spécifique
KeyVaultKey keyVersion = keyClient.getKey("my-key", "<version-id>");

// Obtenir uniquement les propriétés de la clé (pas le matériel de clé)
KeyProperties keyProps = keyClient.getKey("my-key").getProperties();

Mettre à jour les propriétés de la clé

KeyVaultKey key = keyClient.getKey("my-key");

// Mettre à jour les propriétés
key.getProperties()
    .setEnabled(false)
    .setExpiresOn(OffsetDateTime.now().plusMonths(6))
    .setTags(Map.of("status", "archived"));

KeyVaultKey updatedKey = keyClient.updateKeyProperties(key.getProperties(),
    KeyOperation.ENCRYPT, KeyOperation.DECRYPT);

Lister les clés

import com.azure.core.util.paging.PagedIterable;

// Lister toutes les clés
for (KeyProperties keyProps : keyClient.listPropertiesOfKeys()) {
    System.out.println("Key: " + keyProps.getName());
    System.out.println("  Enabled: " + keyProps.isEnabled());
    System.out.println("  Created: " + keyProps.getCreatedOn());
}

// Lister les versions des clés
for (KeyProperties version : keyClient.listPropertiesOfKeyVersions("my-key")) {
    System.out.println("Version: " + version.getVersion());
    System.out.println("Created: " + version.getCreatedOn());
}

Supprimer une clé

import com.azure.core.util.polling.SyncPoller;

// Commencer la suppression (coffres avec suppression réversible activée)
SyncPoller<DeletedKey, Void> deletePoller = keyClient.beginDeleteKey("my-key");

// Attendre la suppression
DeletedKey deletedKey = deletePoller.poll().getValue();
System.out.println("Deleted: " + deletedKey.getDeletedOn());

deletePoller.waitForCompletion();

// Purger la clé supprimée (suppression permanente)
keyClient.purgeDeletedKey("my-key");

// Récupérer la clé supprimée
SyncPoller<KeyVaultKey, Void> recoverPoller = keyClient.beginRecoverDeletedKey("my-key");
recoverPoller.waitForCompletion();

Opérations cryptographiques

Chiffrer/Déchiffrer

import com.azure.security.keyvault.keys.cryptography.models.*;

CryptographyClient cryptoClient = new CryptographyClientBuilder()
    .keyIdentifier("https://<vault>.vault.azure.net/keys/<key-name>")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

byte[] plaintext = "Hello, World!".getBytes(StandardCharsets.UTF_8);

// Chiffrer
EncryptResult encryptResult = cryptoClient.encrypt(EncryptionAlgorithm.RSA_OAEP, plaintext);
byte[] ciphertext = encryptResult.getCipherText();
System.out.println("Ciphertext length: " + ciphertext.length);

// Déchiffrer
DecryptResult decryptResult = cryptoClient.decrypt(EncryptionAlgorithm.RSA_OAEP, ciphertext);
String decrypted = new String(decryptResult.getPlainText(), StandardCharsets.UTF_8);
System.out.println("Decrypted: " + decrypted);

Signer/Vérifier

import java.security.MessageDigest;

// Créer le condensé des données
byte[] data = "Data to sign".getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest(data);

// Signer
SignResult signResult = cryptoClient.sign(SignatureAlgorithm.RS256, digest);
byte[] signature = signResult.getSignature();

// Vérifier
VerifyResult verifyResult = cryptoClient.verify(SignatureAlgorithm.RS256, digest, signature);
System.out.println("Valid signature: " + verifyResult.isValid());

Envelopper/Dérouler la clé

// Clé à envelopper (ex. clé AES)
byte[] keyToWrap = new byte[32];  // Clé 256-bit
new SecureRandom().nextBytes(keyToWrap);

// Envelopper
WrapResult wrapResult = cryptoClient.wrapKey(KeyWrapAlgorithm.RSA_OAEP, keyToWrap);
byte[] wrappedKey = wrapResult.getEncryptedKey();

// Dérouler
UnwrapResult unwrapResult = cryptoClient.unwrapKey(KeyWrapAlgorithm.RSA_OAEP, wrappedKey);
byte[] unwrappedKey = unwrapResult.getKey();

Sauvegarde et restauration

// Sauvegarder
byte[] backup = keyClient.backupKey("my-key");

// Enregistrer la sauvegarde dans un fichier
Files.write(Paths.get("key-backup.blob"), backup);

// Restaurer
byte[] backupData = Files.readAllBytes(Paths.get("key-backup.blob"));
KeyVaultKey restoredKey = keyClient.restoreKeyBackup(backupData);

Rotation de clé

// Faire tourner vers une nouvelle version
KeyVaultKey rotatedKey = keyClient.rotateKey("my-key");
System.out.println("New version: " + rotatedKey.getProperties().getVersion());

// Définir la politique de rotation
KeyRotationPolicy policy = new KeyRotationPolicy()
    .setExpiresIn("P90D")  // Expirer après 90 jours
    .setLifetimeActions(Arrays.asList(
        new KeyRotationLifetimeAction(KeyRotationPolicyAction.ROTATE)
            .setTimeBeforeExpiry("P30D")));  // Faire tourner 30 jours avant expiration

keyClient.updateKeyRotationPolicy("my-key", policy);

// Obtenir la politique de rotation
KeyRotationPolicy currentPolicy = keyClient.getKeyRotationPolicy("my-key");

Importer une clé

import com.azure.security.keyvault.keys.models.ImportKeyOptions;
import com.azure.security.keyvault.keys.models.JsonWebKey;

// Importer le matériel de clé existant
JsonWebKey jsonWebKey = new JsonWebKey()
    .setKeyType(KeyType.RSA)
    .setN(modulus)
    .setE(exponent)
    .setD(privateExponent)
    // ... autres composants RSA
    ;

ImportKeyOptions importOptions = new ImportKeyOptions("imported-key", jsonWebKey)
    .setHardwareProtected(false);

KeyVaultKey importedKey = keyClient.importKey(importOptions);

Algorithmes de chiffrement

Algorithme Type de clé Description
RSA1_5 RSA RSAES-PKCS1-v1_5
RSA_OAEP RSA RSAES avec OAEP (recommandé)
RSA_OAEP_256 RSA RSAES avec OAEP utilisant SHA-256
A128GCM OCT AES-GCM 128-bit
A256GCM OCT AES-GCM 256-bit
A128CBC OCT AES-CBC 128-bit
A256CBC OCT AES-CBC 256-bit

Algorithmes de signature

Algorithme Type de clé Hash
RS256 RSA SHA-256
RS384 RSA SHA-384
RS512 RSA SHA-512
PS256 RSA SHA-256 (PSS)
ES256 EC P-256 SHA-256
ES384 EC P-384 SHA-384
ES512 EC P-521 SHA-512

Gestion des erreurs

import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;

try {
    KeyVaultKey key = keyClient.getKey("non-existent-key");
} catch (ResourceNotFoundException e) {
    System.out.println("Key not found: " + e.getMessage());
} catch (HttpResponseException e) {
    System.out.println("HTTP error " + e.getResponse().getStatusCode());
    System.out.println("Message: " + e.getMessage());
}

Variables d'environnement

AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net

Bonnes pratiques

  1. Utiliser les clés HSM pour la production - Définissez setHardwareProtected(true) pour les clés sensibles
  2. Activer la suppression réversible - Protège contre les suppressions accidentelles
  3. Rotation de clé - Configurez des politiques de rotation automatique
  4. Privilèges minimaux - Utilisez des clés distinctes pour différentes opérations
  5. Cryptographie locale si possible - Utilisez CryptographyClient avec le matériel de clé local pour réduire les allers-retours

Expressions déclencheurs

  • "Key Vault keys Java", "clés cryptographiques Java"
  • "encrypt decrypt Java", "signer vérifier Java"
  • "clé RSA", "clé EC", "clé HSM"
  • "rotation de clé", "envelopper dérouler clé"