La dernière fois a essayé d'utiliser le service Cloud Monitor d'Alibaba Cloud, mais cette fois, je vais essayer d'exploiter le service KMS (Key Management Service) d'Alibaba Cloud.
vendeur | Nom du service |
---|---|
AlibabaCloud | Key Management Service |
AWS | Key Management Service |
GCP | Cloud Key Management Service |
Azure | Azure Vault |
Key Management Service(KMS)
KMS (Key Management Service) est un service facile à utiliser qui vous permet de créer, contrôler et stocker en toute sécurité les clés de chiffrement utilisées pour protéger vos données. Vous pouvez utiliser l'API, le SDK ou la console pour générer une clé principale client (CMK) et l'utiliser pour gérer vos clés de chiffrement. Quels problèmes puis-je résoudre avec KMS?
rôle | problème | Comment résoudre les problèmes à l'aide de KMS |
---|---|---|
application/Développeur de site Web | プログラムは、暗号化のためのキーを使用する必要があります。キーを安全かつ独立して管理する必要があります。applicationがどこにあってもキーに安全にアクセスする必要があります。 | La technologie de cryptage intégrée permet aux utilisateurs de stocker la clé principale du client (CMK) dans le KMS et de déployer uniquement la clé de données cryptée. En outre, les utilisateurs peuvent appeler l'API KMS pour déchiffrer la clé de données uniquement en cas de besoin. |
Développeur de services | Le développeur ne souhaite pas être responsable de la sécurité des clés et des données de l'utilisateur. Les utilisateurs doivent gérer leurs clés personnellement, mais les développeurs peuvent simplement utiliser les clés qu'ils spécifient pour se concentrer sur le développement. | Sur la base de la technologie de chiffrement d'enveloppe et de l'API publique de KMS, les développeurs de services utilisent la clé CMK spécifiée pour chiffrer leurs clés de données./Il peut être décrypté. La gestion des clés est laissée à l'utilisateur. |
Agent de sécurité | La gestion des clés de l'entreprise est nécessaire pour répondre aux exigences de conformité. La personne responsable doit s'assurer que la clé est approuvée étape par étape et que l'utilisation de la clé est vérifiée. | KMS peut être associé à la RAM pour une gestion intégrée de l'authentification. |
Cette fois, du point de vue d'un développeur d'applications / de sites Web, j'aimerais utiliser le SDK (Java) de KMS (Key Management Service) pour vérifier le cryptage et le traitement composé d'informations textuelles avec la clé principale du client (CMK).
Eh bien, travaillons. Nos objectifs couvriront tout, de la création d'une clé principale client (CMK) à la mise en œuvre d'un complexe de chiffrement pour les informations textuelles à l'aide du SDK.
-Connectez-vous à la [Console KMS]. · Cliquez sur le bouton Créer une clé dans le coin supérieur droit de la page. -Saisissez des informations telles qu'une description. -Cliquez sur OK].
-Cliquez sur le bouton [Clés d'accès] en haut de la page d'accueil. -Cliquez sur le bouton «Continuer à gérer la clé d'accès» sur l'écran de confirmation pour obtenir des conseils de sécurité. -Lorsque vous êtes redirigé vers la page de gestion des clés d'accès, cliquez sur le bouton [Créer une clé d'accès]. -Lorsque la création de la clé est terminée, cliquez sur le lien [Affichage] et notez les informations d'ID de clé d'accès et de secret de clé d'accès affichées. * Il est nécessaire de l'utiliser pour le programme complexe de cryptage décrit plus loin.
-Créer un projet Maven à partir d'Eclipse. * Veuillez vous référer aux informations d'entrée au moment de la création. Peut être changé Group Id:com.kms Artifact Id:kms-test -Ajoutez les paramètres de dépendance des deux bibliothèques Alibaba Cloud SDK suivantes utilisées pour la vérification au fichier pom. aliyun-java-sdk-core aliyun-java-sdk-kms
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>
Créez le programme de flux de vérification suivant. ・ Liste de tous les CMK ・ Acquisition des informations CMK ・ Hello world Le texte brut est crypté avec CMK ・ Texte composé Hello world avec 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;
//Version actuelle du SDK KMS: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;
//Création client Aliyun
private static DefaultAcsClient kmsClient(String regionId, String accessKeyId, String accessKeySecret) {
/**
*Création du client Aliyun:
* RegionId, AccessKeyId,Définir AccessKeySecret
*/
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
//Obtenez des informations détaillées sur 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;
}
//Obtenir des informations sur la liste des CMK enregistrées
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;
}
//Acquisition d'informations clés de données
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);
/**
*Définissez les paramètres conformément à la documentation KMS openAPI.
* 1.KeyId
* 2.KeyDescription
* 3.NumberOfBytes
*/
genDKReq.setKeySpec(keyDesc);
genDKReq.setKeyId(keyId);
genDKReq.setNumberOfBytes(numOfBytes);
final GenerateDataKeyResponse genDKRes = kmsClient.getAcsResponse(genDKReq);
return genDKRes;
}
//Effectuer le traitement de cryptage
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;
}
//Effectuer un traitement complexe
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("À partir du service KMS");
System.out.println("===========================================\n");
/**
*Définir les informations d'accès
*/
String regionId = "ap-northeast-1";
String accessKeyId = "★★ Définissez l'ID de la clé d'accès que vous avez noté à l'étape précédente ★★";
String accessKeySecret = "★★ Définissez le secret de la clé d'accès que vous avez noté à l'étape précédente ★★";
kmsClient = kmsClient(regionId, accessKeyId, accessKeySecret);
String keyId = null;
String plainText = "hello world";
String cipherBlob = null;
/*Répertoriez toutes les clés principales de votre compte*/
try {
final ListKeysResponse listKeysRes = ListKey(1, 100);
/**
*Analysez la réponse et traitez-la davantage
*/
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("Liste réussie de toutes les CMK!\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());
}
/*Description clé*/
try {
final DescribeKeyResponse decKeyRes = DescribeKey(keyId);
/**
*Analysez la réponse et traitez-la davantage
*/
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("Acquisition réussie des informations CMK!");
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());
}
/*Création de clé de données*/
/**
*Demander et faire réapparaître
*/
try {
final GenerateDataKeyResponse genDKResponse = GenerateDataKey(keyId, "AES_256", 64);
/**
*Analysez la réponse et traitez-la davantage
*/
System.out.println("CiphertextBlob: " + genDKResponse.getCiphertextBlob());
System.out.println("KeyId: " + genDKResponse.getKeyId());
System.out.println("Plaintext: " + genDKResponse.getPlaintext());
System.out.println("===========================================");
System.out.println("Création de clé de données réussie!");
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());
}
/**
*Crypter du texte brut pour obtenir le chiffrement
*/
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("Cryptage réussi du texte brut!");
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());
}
/**
*Décryptez le texte chiffré et vérifiez le résultat dans le texte brut d'origine.
*/
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("Décryptage réussi du texte crypté, résultat" + (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());
}
}
}
-La configuration de pliage du projet construit avec Maven est la suivante. * Vous pouvez également vérifier la version de la bibliothèque SDK d'Alibaba Cloud.
-Exécuter le projet. Le résultat de l'exécution est le suivant.
===========================================
À partir du service KMS
===========================================
TotalCount: 3
PageNumber: 1
PageSize: 100
KeyId: 0cc16ce2-a542-4859-a778-3131a2185d79
KeyId: 4f9cb01a-f2b8-49f8-8518-4f0faf99bfa8
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Liste réussie de toutes les CMK!
===========================================
DescribeKey Response:
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
Description:Pour le test KMS
KeyState: Enabled
KeyUsage: ENCRYPT/DECRYPT
===========================================
Acquisition réussie des informations CMK!
===========================================
CiphertextBlob: NTJiODkwZTMtOTE5My00YTlkLTkxMmYtZDU1YjRkZTMxMTYxTURGUlQvMTFtbTFId1ZOMHFhVzEySWpYVmhjWmRiR0xBQUFBQUFBQUFBQVFsREU2TXV5Ukd3R2FCUWtMSjlHRjUycDh4aTQ3YmxTWDFYR0xjOEd0SWU5cWtsRWdGWm40WGpnK2xlbzVXbXl1WkpHY04wOWJRdUh3dnNZTXFCQUxtY3NLUkdGUTJxdUYzdFF3aXhIYVBzcXMxbmkxVzBEeGFkVGZWcGtXdmZtNDBnN0JFbDNTV3c9PQ==
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
Plaintext: hlSY2y9iOEWKg39MAC5p6sxm7b3KtKyHchgs2urCG9lG0bEp2p3yKugDUTASbMF6WQhj4dhZUqNeNry0R2FpGg==
===========================================
Création de clé de données réussie!
===========================================
CiphertextBlob: NTJiODkwZTMtOTE5My00YTlkLTkxMmYtZDU1YjRkZTMxMTYxaytYdGpzRS9sK2ZQRjhCM21ad3pZZmlGOHM4NUp3MVpBQUFBQUFBQUFBQXlaa0syTzdocEI2bjJubTFwTWtHVnJLa2NyYnRMa2xCcCs1WT0=
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Cryptage réussi du texte brut!
===========================================
Plaintext: hello world
KeyId: bb8749d6-06a6-42bd-9724-6811a46c3bb8
===========================================
Décryptage réussi du texte crypté, correspondance des résultats
===========================================
Cette fois, j'ai essayé de vérifier le cryptage et le traitement composé des informations textuelles à l'aide du SDK de KMS (Key Management Service). À partir de maintenant, créons et gérons la clé de chiffrement utilisée dans le programme dans KMS afin qu'elle puisse être gérée en toute sécurité et indépendamment.
Recommended Posts