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.
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.
-Klicken Sie oben auf der Startseite auf die Schaltfläche [Zugriffstasten].
-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>
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());
}
}
}
-Die Falzkonfiguration des mit Maven erstellten Projekts ist wie folgt. * Sie können auch die Version der SDK-Bibliothek von Alibaba Cloud überprüfen.
===========================================
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
===========================================
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