[JAVA] Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden

Letztes Mal hat versucht, den Cloud Monitor-Dienst von Alibaba Cloud zu verwenden, aber dieses Mal werde ich versuchen, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu betreiben.

Verkäufer Dienstname
AlibabaCloud Key Management Service
AWS Key Management Service
GCP Cloud Key Management Service
Azure Azure Vault

Key Management Service(KMS)

KMS (Key Management Service) ist ein benutzerfreundlicher Dienst, mit dem Sie Verschlüsselungsschlüssel zum Schutz Ihrer Daten erstellen, steuern und sicher speichern können. Sie können die API, das SDK oder die Konsole verwenden, um einen Kundenstammschlüssel (Customer Master Key, CMK) zu generieren und damit Ihre Verschlüsselungsschlüssel zu verwalten. Welche Probleme kann ich mit KMS lösen?

Rolle Problem So lösen Sie Probleme mit KMS
Anwendung/Webseitenentwickler プログラムは、暗号化のためのキーを使用する必要があります。キーを安全かつ独立して管理する必要があります。Anwendungがどこにあってもキーに安全にアクセスする必要があります。 Mithilfe der eingebetteten Verschlüsselungstechnologie können Benutzer den Customer Master Key (CMK) im KMS speichern und nur den verschlüsselten Datenschlüssel bereitstellen. Darüber hinaus können Benutzer die KMS-API aufrufen, um den Datenschlüssel nur bei Bedarf zu entschlüsseln.
Serviceentwickler Der Entwickler möchte nicht für die Sicherheit der Schlüssel und Daten des Benutzers verantwortlich sein. Benutzer müssen ihre Schlüssel persönlich verwalten, aber Entwickler können einfach die von ihnen angegebenen Schlüssel verwenden, um sich auf die Entwicklung zu konzentrieren. Basierend auf der Envelope-Verschlüsselungstechnologie und der öffentlichen API von KMS verwenden Serviceentwickler das angegebene CMK, um ihre Datenschlüssel zu verschlüsseln./Es kann entschlüsselt werden. Die Schlüsselverwaltung bleibt dem Benutzer überlassen.
Sicherheitsbeauftragter Die Verwaltung der Unternehmensschlüssel ist erforderlich, um die Compliance-Anforderungen zu erfüllen. Die verantwortliche Person muss sicherstellen, dass der Schlüssel Schritt für Schritt genehmigt und die Verwendung des Schlüssels überprüft wird. KMS kann für die integrierte Authentifizierungsverwaltung mit RAM verknüpft werden.

Dieses Mal möchte ich aus Sicht eines Anwendungs- / Website-Entwicklers das SDK (Java) von KMS (Key Management Service) verwenden, um die Verschlüsselung und zusammengesetzte Verarbeitung von Textinformationen mit dem Customer Master Key (CMK) zu überprüfen.

Verfahren

Lass uns arbeiten. Unsere Ziele umfassen alles von der Erstellung eines Customer Master Key (CMK) bis zur Implementierung eines Verschlüsselungskomplexes für Textinformationen mithilfe des SDK.

  1. Erstellen eines Kundenstammschlüssels (CMK)
  2. Zugriffsschlüssel abrufen
  3. Überprüfung der Verschlüsselung und der Verarbeitung von Verbindungen

1. Erstellen eines Kundenstammschlüssels (CMK)

■ Erstellen eines CMK

2. Zugriffsschlüssel abrufen

■ Erwerb des Zugangsschlüssels

-Klicken Sie oben auf der Startseite auf die Schaltfläche [Zugriffstasten]. スクリーンショット 2018-05-12 21.31.46.png

3. Überprüfung der Verschlüsselung und der Verarbeitung von Verbindungen

■ Erstellen eines Überprüfungsprojekts

-Erstelle ein Maven-Projekt aus Eclipse. * Bitte beachten Sie die Eingabeinformationen zum Zeitpunkt der Erstellung. Kann gewechselt werden  Group Id:com.kms  Artifact Id:kms-test

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kms</groupId>
  <artifactId>kms-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>kms-test</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
	<dependency>
	    <groupId>com.aliyun</groupId>
	    <artifactId>aliyun-java-sdk-core</artifactId>
	    <version>3.5.0</version>
	</dependency>
	<dependency>
	    <groupId>com.aliyun</groupId>
	    <artifactId>aliyun-java-sdk-kms</artifactId>
	    <version>2.5.0</version>
	</dependency>
  </dependencies>
</project>

■ Erstellung eines Verifizierungsprogramms

Erstellen Sie das folgende Überprüfungsablaufprogramm. ・ Liste aller CMKs ・ Erfassung von CMK-Informationen ・ Hallo Welt Klartext wird mit CMK verschlüsselt ・ Hallo Welt zusammengesetzter Text mit CMK

App.java


package com.kms.kms_test;

import java.util.*;
import java.util.List;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
//Aktuelle KMS SDK-Version:2016-01-20
import com.aliyuncs.kms.model.v20160120.DecryptRequest;
import com.aliyuncs.kms.model.v20160120.DecryptResponse;
import com.aliyuncs.kms.model.v20160120.DescribeKeyRequest;
import com.aliyuncs.kms.model.v20160120.DescribeKeyResponse;
import com.aliyuncs.kms.model.v20160120.EncryptRequest;
import com.aliyuncs.kms.model.v20160120.EncryptResponse;
import com.aliyuncs.kms.model.v20160120.GenerateDataKeyRequest;
import com.aliyuncs.kms.model.v20160120.GenerateDataKeyResponse;
import com.aliyuncs.kms.model.v20160120.ListKeysRequest;
import com.aliyuncs.kms.model.v20160120.ListKeysResponse;
import com.aliyuncs.kms.model.v20160120.ListKeysResponse.Key;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
public class App
{
    static DefaultAcsClient kmsClient;
    //Aliyun Client-Erstellung
    private static DefaultAcsClient kmsClient(String regionId, String accessKeyId, String accessKeySecret) {
        /**
         *Aliyun Client-Erstellung:
         * RegionId, AccessKeyId,Stellen Sie AccessKeySecret ein
         */
        IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }
    //Erhalten Sie detaillierte Informationen zu CMK
    private static DescribeKeyResponse DescribeKey(String keyId) throws ClientException {
        final DescribeKeyRequest decKeyReq = new DescribeKeyRequest();
        decKeyReq.setProtocol(ProtocolType.HTTPS);
        decKeyReq.setAcceptFormat(FormatType.JSON);
        decKeyReq.setMethod(MethodType.POST);
        decKeyReq.setKeyId(keyId);
        final DescribeKeyResponse decKeyRes = kmsClient.getAcsResponse(decKeyReq);
        return decKeyRes;
    }
    //Listeninformationen der registrierten CMK abrufen
    private static ListKeysResponse ListKey(int pageNumber, int pageSize) throws ClientException {
        final ListKeysRequest listKeysReq = new ListKeysRequest();
        listKeysReq.setProtocol(ProtocolType.HTTPS);
        listKeysReq.setAcceptFormat(FormatType.JSON);
        listKeysReq.setMethod(MethodType.POST);
        listKeysReq.setPageNumber(pageNumber);
        listKeysReq.setPageSize(pageSize);
        final ListKeysResponse listKeysRes = kmsClient.getAcsResponse(listKeysReq);
        return listKeysRes;
    }
    //Erfassung von Datenschlüsselinformationen
    private static GenerateDataKeyResponse GenerateDataKey(String keyId, String keyDesc, int numOfBytes) throws ClientException {
        final  GenerateDataKeyRequest genDKReq = new GenerateDataKeyRequest();
        genDKReq.setProtocol(ProtocolType.HTTPS);
        genDKReq.setAcceptFormat(FormatType.JSON);
        genDKReq.setMethod(MethodType.POST);
        /**
         *Stellen Sie die Parameter gemäß der KMS openAPI-Dokumentation ein.
         * 1.KeyId
         * 2.KeyDescription
         * 3.NumberOfBytes
         */
        genDKReq.setKeySpec(keyDesc);
        genDKReq.setKeyId(keyId);
        genDKReq.setNumberOfBytes(numOfBytes);
        final GenerateDataKeyResponse genDKRes = kmsClient.getAcsResponse(genDKReq);
        return genDKRes;
    }
    //Führen Sie die Verschlüsselungsverarbeitung durch
    private static  EncryptResponse Encrypt(String keyId, String plainText) throws ClientException {
        final EncryptRequest encReq = new EncryptRequest();
        encReq.setProtocol(ProtocolType.HTTPS);
        encReq.setAcceptFormat(FormatType.JSON);
        encReq.setMethod(MethodType.POST);
        encReq.setKeyId(keyId);
        encReq.setPlaintext(plainText);
        final EncryptResponse encResponse = kmsClient.getAcsResponse(encReq);
        return encResponse;
    }
    //Führen Sie eine komplexe Verarbeitung durch
    private static DecryptResponse Decrypt(String cipherBlob) throws ClientException {
        final DecryptRequest decReq = new DecryptRequest();
        decReq.setProtocol(ProtocolType.HTTPS);
        decReq.setAcceptFormat(FormatType.JSON);
        decReq.setMethod(MethodType.POST);
        decReq.setCiphertextBlob(cipherBlob);
        final DecryptResponse decResponse = kmsClient.getAcsResponse(decReq);
        return decResponse;
    }
    public static void main(String[] args) {
        System.out.println("===========================================");
        System.out.println("Beginnend mit dem KMS-Service");
        System.out.println("===========================================\n");
        /**
         *Legen Sie die Zugriffsinformationen fest
         */
        String regionId = "ap-northeast-1";
        String accessKeyId = "★★ Legen Sie die Zugangsschlüssel-ID fest, die Sie im vorherigen Schritt notiert haben ★★";
        String accessKeySecret = "★★ Legen Sie das im vorherigen Schritt notierte Zugriffsschlüsselgeheimnis fest ★★";
        kmsClient = kmsClient(regionId, accessKeyId, accessKeySecret);
        String keyId = null;
        String plainText = "hello world";
        String cipherBlob = null;
        /*Listen Sie alle Hauptschlüssel in Ihrem Konto auf*/
        try {
            final ListKeysResponse listKeysRes = ListKey(1, 100);
            /**
             *Analysieren Sie die Antwort und verarbeiten Sie sie weiter
             */
            System.out.println("TotalCount: " + listKeysRes.getTotalCount());
            System.out.println("PageNumber: " + listKeysRes.getPageNumber());
            System.out.println("PageSize: " + listKeysRes.getPageSize());
            List<Key> keys = listKeysRes.getKeys();
            Iterator<Key> iterator = keys.iterator();
            while (iterator.hasNext()) {
                keyId = iterator.next().getKeyId();
                System.out.println("KeyId: " + keyId);
            }
            System.out.println("===========================================");
            System.out.println("Erfolgreiche Auflistung aller CMKs!\n");
            System.out.println("===========================================\n");
        } catch (ClientException eResponse) {
            System.out.println("Failed.");
            System.out.println("Error code: " + eResponse.getErrCode());
            System.out.println("Error message: " + eResponse.getErrMsg());
        }
        /*Schlüsselbeschreibung*/
        try {
            final DescribeKeyResponse decKeyRes = DescribeKey(keyId);
            /**
             *Analysieren Sie die Antwort und verarbeiten Sie sie weiter
             */
            System.out.println("DescribeKey Response: ");
            DescribeKeyResponse.KeyMetadata meta = decKeyRes.getKeyMetadata();
            System.out.println("KeyId: " + meta.getKeyId());
            System.out.println("Description: " + meta.getDescription());
            System.out.println("KeyState: " + meta.getKeyState());
            System.out.println("KeyUsage: " + meta.getKeyUsage());
            System.out.println("===========================================");
            System.out.println("Erfolgreiche Erfassung von CMK-Informationen!");
            System.out.println("===========================================\n");
        } catch (ClientException eResponse) {
            System.out.println("Failed.");
            System.out.println("Error code: " + eResponse.getErrCode());
            System.out.println("Error message: " + eResponse.getErrMsg());
        }
        /*Datenschlüsselerstellung*/
        /**
         *Fordern Sie an und erhalten Sie Respawn
         */
        try {
            final GenerateDataKeyResponse genDKResponse = GenerateDataKey(keyId, "AES_256", 64);
            /**
             *Analysieren Sie die Antwort und verarbeiten Sie sie weiter
             */
            System.out.println("CiphertextBlob: " + genDKResponse.getCiphertextBlob());
            System.out.println("KeyId: " + genDKResponse.getKeyId());
            System.out.println("Plaintext: " + genDKResponse.getPlaintext());
            System.out.println("===========================================");
            System.out.println("Erfolgreiche Datenschlüsselerstellung!");
            System.out.println("===========================================\n");
        } catch (ClientException eResponse) {
            System.out.println("Failed.");
            System.out.println("Error code: " + eResponse.getErrCode());
            System.out.println("Error message: " + eResponse.getErrMsg());
        }
        /**
         *Verschlüsseln Sie einfachen Text, um die Chiffre zu erhalten
         */
        try {
            EncryptResponse encResponse = Encrypt(keyId, plainText);
            cipherBlob = encResponse.getCiphertextBlob();
            System.out.println("CiphertextBlob: " + cipherBlob);
            System.out.println("KeyId: " + encResponse.getKeyId());
            System.out.println("===========================================");
            System.out.println("Erfolgreiche Verschlüsselung von Klartext!");
            System.out.println("===========================================\n");
        } catch (ClientException eResponse) {
            System.out.println("Failed.");
            System.out.println("Error code: " + eResponse.getErrCode());
            System.out.println("Error message: " + eResponse.getErrMsg());
        }
        /**
         *Entschlüsseln Sie den verschlüsselten Text und überprüfen Sie das Ergebnis im ursprünglichen Klartext.
         */
        try {
            DecryptResponse decResponse = Decrypt(cipherBlob);
            System.out.println("Plaintext: " + decResponse.getPlaintext());
            String verifyPlainText = decResponse.getPlaintext();
            int isMatch = verifyPlainText.compareTo(plainText);
            System.out.println("KeyId: " + decResponse.getKeyId());
            System.out.println("===========================================");
            System.out.printf("Erfolgreiche Entschlüsselung von verschlüsseltem Text, Ergebnis" + (isMatch == 0 ? "match" + "\n" : "mismatch" + "\n"));
            System.out.println("===========================================\n");
        } catch (ClientException eResponse) {
            System.out.println("Failed.");
            System.out.println("Error code: " + eResponse.getErrCode());
            System.out.println("Error message: " + eResponse.getErrMsg());
        }
    }
}

■ Erstellen und Ausführen eines Überprüfungsprojekts

-Die Falzkonfiguration des mit Maven erstellten Projekts ist wie folgt. * Sie können auch die Version der SDK-Bibliothek von Alibaba Cloud überprüfen. スクリーンショット 2018-05-12 22.30.03.png

===========================================
Beginnend mit dem KMS-Service
===========================================

TotalCount: 3
PageNumber: 1
PageSize: 100
KeyId: 0cc16ce2-a542-4859-a778-3131a2185d79
KeyId: 4f9cb01a-f2b8-49f8-8518-4f0faf99bfa8
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Erfolgreiche Auflistung aller CMKs!

===========================================

DescribeKey Response: 
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
Description:Für den KMS-Test
KeyState: Enabled
KeyUsage: ENCRYPT/DECRYPT
===========================================
Erfolgreiche Erfassung von CMK-Informationen!
===========================================

CiphertextBlob: NTJiODkwZTMtOTE5My00YTlkLTkxMmYtZDU1YjRkZTMxMTYxTURGUlQvMTFtbTFId1ZOMHFhVzEySWpYVmhjWmRiR0xBQUFBQUFBQUFBQVFsREU2TXV5Ukd3R2FCUWtMSjlHRjUycDh4aTQ3YmxTWDFYR0xjOEd0SWU5cWtsRWdGWm40WGpnK2xlbzVXbXl1WkpHY04wOWJRdUh3dnNZTXFCQUxtY3NLUkdGUTJxdUYzdFF3aXhIYVBzcXMxbmkxVzBEeGFkVGZWcGtXdmZtNDBnN0JFbDNTV3c9PQ==
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
Plaintext: hlSY2y9iOEWKg39MAC5p6sxm7b3KtKyHchgs2urCG9lG0bEp2p3yKugDUTASbMF6WQhj4dhZUqNeNry0R2FpGg==
===========================================
Erfolgreiche Datenschlüsselerstellung!
===========================================

CiphertextBlob: NTJiODkwZTMtOTE5My00YTlkLTkxMmYtZDU1YjRkZTMxMTYxaytYdGpzRS9sK2ZQRjhCM21ad3pZZmlGOHM4NUp3MVpBQUFBQUFBQUFBQXlaa0syTzdocEI2bjJubTFwTWtHVnJLa2NyYnRMa2xCcCs1WT0=
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Erfolgreiche Verschlüsselung von Klartext!
===========================================

Plaintext: hello world
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Erfolgreiche Entschlüsselung von verschlüsseltem Text, Ergebnisübereinstimmung
===========================================

abschließend

Dieses Mal habe ich versucht, die Verschlüsselung und zusammengesetzte Verarbeitung von Textinformationen mithilfe des SDK von KMS (Key Management Service) zu überprüfen. Von nun an erstellen und verwalten wir den im Programm in KMS verwendeten Verschlüsselungsschlüssel, damit er sicher und unabhängig verwaltet werden kann.

Recommended Posts

Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, die Cache-Funktion des Application Container Cloud Service zu verwenden
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, Scalar DL mit Docker zu verwenden
Umschlagverschlüsselung mit AWS Key Management Service
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Junit mit Mac VScode Maven zu verwenden
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
Ich habe versucht, ein Personalmanagement-Tool zu entwickeln
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden