[JAVA] J'ai essayé d'utiliser le service KMS (Key Management Service) d'Alibaba Cloud

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

procédure

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.

  1. Création d'une clé principale client (CMK)
  2. Obtenir la clé d'accès
  3. Vérification du cryptage et du traitement composé

1. Création d'une clé principale client (CMK)

■ Création d'une clé CMK

-Connectez-vous à la [Console KMS]. · Cliquez sur le bouton Créer une clé dans le coin supérieur droit de la page. スクリーンショット 2018-05-12 21.24.32.png -Saisissez des informations telles qu'une description. -Cliquez sur OK]. スクリーンショット 2018-05-12 21.25.17.png

2. Obtenir la clé d'accès

■ Acquisition de la clé d'accès

-Cliquez sur le bouton [Clés d'accès] en haut de la page d'accueil. スクリーンショット 2018-05-12 21.31.46.png -Cliquez sur le bouton «Continuer à gérer la clé d'accès» sur l'écran de confirmation pour obtenir des conseils de sécurité. スクリーンショット 2018-05-12 21.32.26.png -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]. スクリーンショット 2018-05-12 21.37.34.png -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. スクリーンショット 2018-05-12 21.37.59.png スクリーンショット 2018-05-12 21.38.16.png

3. Vérification du cryptage et du traitement composé

■ Création d'un projet de vérification

-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éation d'un programme de vérification

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());
        }
    }
}

■ Créer et exécuter un projet de vérification

-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. スクリーンショット 2018-05-12 22.30.03.png

-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
===========================================

en conclusion

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

J'ai essayé d'utiliser le service KMS (Key Management Service) d'Alibaba Cloud
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
J'ai essayé d'utiliser Java REPL
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé d'utiliser la fonction de cache d'Application Container Cloud Service
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
[Android] J'ai essayé d'utiliser la disposition du coordinateur.
J'ai essayé d'utiliser le conteneur Pari gp
J'ai essayé d'utiliser WebAssembly Stadio (version 2018/4/17)
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé d'utiliser l'outil de diagnostic Java Arthas
J'ai essayé d'utiliser UICollectionViewListCell ajouté à partir de Xcode12.
J'ai essayé d'utiliser Scalar DL avec Docker
Chiffrement d'enveloppe avec AWS Key Management Service
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
C'est nouveau, mais j'ai essayé d'utiliser Groonga
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé d'utiliser Junit avec Mac VScode Maven
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
[Pour les débutants] J'ai essayé d'utiliser JUnit 5 avec Eclipse
J'ai essayé de développer un outil de gestion des effectifs
[Android] J'ai quitté SQLite et essayé d'utiliser Realm
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
[API] J'ai essayé d'utiliser l'API de recherche par code postal
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA