[JAVA] Chiffrement d'enveloppe avec AWS Key Management Service

introduction

AWS Key Management Service (KMS) est un service géré pour gérer les clés de chiffrement utilisées pour chiffrer les données. KMS peut gérer les données en toute sécurité à l'aide d'une méthode de cryptage appelée cryptage d'enveloppe.

J'ai résumé les exemples d'implémentation Java du cryptage d'enveloppe car il existe peu de documents japonais.

Qu'est-ce que le cryptage des enveloppes?

Grosso modo

C'est un mécanisme pour le sécuriser en utilisant correctement.

e076de0e-e74e-0f63-a339-f6d565b89743.png

Une méthode de cryptage courante protège les données en texte brut en les cryptant avec une sorte de clé. À ce stade, si cette clé est volée avec les données, le code sera décrypté et les données brutes seront visibles. Par conséquent, l'idée du chiffrement d'enveloppe est de protéger plus fortement les données en chiffrant davantage la clé qui a chiffré les données avec une autre clé.

Le chiffrement des données à l'aide de KMS peut être réalisé par le flux suivant.

--Générer une clé principale sur l'écran de la console KMS --Générer la clé de données à partir de la clé principale

Exemple d'implémentation

Voici un exemple de mise en œuvre du chiffrement d'enveloppe en Java.

Nous supposerons que la clé principale a été générée à l'avance à partir de l'écran de la console KMS. Pour la procédure de génération de clé principale, consultez le Manuel AWS ou [Developers.IO](http: / Veuillez vous référer aux articles tels que /dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-relearning-key-management-service/).

Préparation préalable

AWS fournit un SDK pour l'utilisation de KMS. Voici un exemple d'utilisation de la bibliothèque via Gradle. Ajoutez la dépendance suivante à build.gradle.

dependencies {
    compile "com.amazonaws:aws-java-sdk-kms:1.11.202"
}

chiffrement

Tout d'abord, créez une instance de ʻAWSKMSClient` à l'aide de la clé d'accès AWS et de la clé secrète.

BasicAWSCredentials credentials = new BasicAWSCredentials("accessKey...", "SecretKey...");
AWSKMSClient client = (AWSKMSClient) AWSKMSClientBuilder.standard()
    .withRegion("ap-northeast-1")
    .withCredentials(new AWSStaticCredentialsProvider(credentials))
    .build();

Générez une clé de données à l'aide du client généré. Vous pouvez obtenir la clé de données en créant une instance de GenerateDataKeyRequest et en faisant generateDataKey en spécifiant le KeyId comme ARN de la clé principale générée à partir de la console KMS.

GenerateDataKeyRequest generateDataKeyRequest = new GenerateDataKeyRequest()
    .withKeyId("arn:aws:kms:...")
    .withKeySpec(DataKeySpec.AES_128);
GenerateDataKeyResult dataKeyResult = client.generateDataKey(generateDataKeyRequest);

Cryptez les données en texte brut à l'aide de la clé de données générée. Ici, AES est utilisé pour le cryptage, mais veuillez utiliser n'importe quelle méthode de cryptage.

try {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE,
                new SecretKeySpec(dataKeyResult.getPlaintext().array(), "AES"));
    String decriptedText = Base64.getEncoder()
        .encodeToString(cipher.doFinal("plainText...".getBytes()));
} catch (Exception e) {
    // do something.
}

Le decriptedText généré et la clé de données chiffrée (vous pouvez obtenir la clé chiffrée avec dataKeyResult.getCiphertextBlob ()) doivent être codés avec Base64 et copiés dans un fichier yaml etc. et sauvegardés. Allons-y.

Décryptage

Vient ensuite la procédure de décryptage des données cryptées. Le décryptage se fait en générant une decryptRequest à partir de la clé de données chiffrée.

DecryptRequest decryptRequest = new DecryptRequest()
    .withCiphertextBlob(ByteBuffer.wrap(Base64.getDecoder().decode("decryptedDatakey...".getBytes())));
ByteBuffer plainTextKey = client.decrypt(decryptRequest).getPlaintext();

Avec les étapes jusqu'à ce point, vous avez réussi à reconvertir la clé de données chiffrée en une clé de données simple. Ensuite, décryptez les données chiffrées à l'aide de la clé de données obtenue.

byte[] decodeBase64src = Base64.getDecoder().decode("decryptedText...");
try {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, plainTextKey);
    String plainText = new String(cipher.doFinal(decodeBase64src));
} catch (Exception e) {
    // do something.
}

Supprimez immédiatement la clé de données de texte brut extraite (plainTextKey).

plainTextKey.clear();

Matériel de référence

Recommended Posts

Chiffrement d'enveloppe avec AWS Key Management Service
KMS) Chiffrement d'enveloppe avec décryptage openssl et java
J'ai essayé d'utiliser le service KMS (Key Management Service) d'Alibaba Cloud