[JAVA] Umschlagverschlüsselung mit AWS Key Management Service

Einführung

AWS Key Management Service (KMS) ist ein verwalteter Dienst zum Verwalten der zum Verschlüsseln von Daten verwendeten Verschlüsselungsschlüssel. KMS kann Daten mithilfe einer Verschlüsselungsmethode, die als Umschlagverschlüsselung bezeichnet wird, sicher verarbeiten.

Ich habe die Java-Implementierungsbeispiele für die Umschlagverschlüsselung zusammengefasst, da es nur wenige japanische Dokumente gibt.

Was ist Umschlagverschlüsselung?

Grob gesagt

Es ist ein Mechanismus, um es durch ordnungsgemäße Verwendung sicher zu machen.

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

Eine übliche Verschlüsselungsmethode schützt Klartextdaten, indem sie mit einem Schlüssel verschlüsselt werden. Wenn zu diesem Zeitpunkt dieser Schlüssel zusammen mit den Daten gestohlen wird, wird der Code entschlüsselt und die Rohdaten werden sichtbar. Daher besteht die Idee der Umschlagverschlüsselung darin, die Daten stärker zu schützen, indem der Schlüssel, der die Daten verschlüsselt hat, mit einem anderen Schlüssel weiter verschlüsselt wird.

Die Datenverschlüsselung mit KMS kann durch den folgenden Fluss realisiert werden.

Implementierungsbeispiel

Im Folgenden finden Sie ein Beispiel für die Implementierung der Umschlagverschlüsselung in Java.

Wir gehen davon aus, dass der Hauptschlüssel im Voraus auf dem KMS-Konsolenbildschirm generiert wurde. Informationen zum Generieren des Hauptschlüssels finden Sie in AWS-Handbuch oder [Developers.IO](http: / Weitere Informationen finden Sie in Artikeln wie /dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-relearning-key-management-service/).

Vorbereitungen

AWS bietet ein SDK für die Verwendung von KMS. Hier ist ein Beispiel für die Verwendung der Bibliothek über Gradle. Fügen Sie build.gradle die folgende Abhängigkeit hinzu.

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

Verschlüsselung

Erstellen Sie zunächst eine Instanz von "AWSKMSClient" mit dem AWS-Zugriffsschlüssel und dem geheimen Schlüssel.

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

Generieren Sie einen Datenschlüssel mit dem generierten Client. Sie können den Datenschlüssel abrufen, indem Sie eine Instanz von "GenerateDataKeyRequest" erstellen und "generateDataKey" ausführen, indem Sie die KeyId als ARN des von der KMS-Konsole generierten Hauptschlüssels angeben.

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

Verschlüsseln Sie Klartextdaten mit dem generierten Datenschlüssel. Hier wird AES für die Verschlüsselung verwendet, bitte verwenden Sie jedoch eine beliebige Verschlüsselungsmethode.

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.
}

Der generierte decriptedText und der verschlüsselte Datenschlüssel (Sie können den verschlüsselten mit dataKeyResult.getCiphertextBlob () erhalten) sollten mit Base64 codiert und in eine yaml-Datei usw. kopiert und gespeichert werden. Lass uns gehen.

Entschlüsselung

Als nächstes wird das Verfahren zum Entschlüsseln verschlüsselter Daten beschrieben. Die Entschlüsselung erfolgt durch Generieren einer "decryptRequest" aus dem verschlüsselten Datenschlüssel.

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

Mit den Schritten bis zu diesem Punkt haben Sie den verschlüsselten Datenschlüssel erfolgreich wieder in einen einfachen Datenschlüssel konvertiert. Entschlüsseln Sie dann die verschlüsselten Daten mit dem erhaltenen Datenschlüssel.

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.
}

Verwerfen Sie den extrahierten Nur-Text-Datenschlüssel (plainTextKey) sofort.

plainTextKey.clear();

Referenzmaterial

Recommended Posts

Umschlagverschlüsselung mit AWS Key Management Service
KMS) Umschlagverschlüsselung mit OpenSL- und Java-Entschlüsselung
Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden