Tous les produits
Search
Centre de documentation

Key Management Service:Utiliser une clé pour chiffrer et déchiffrer des données

Dernière mise à jour :Aug 25, 2026

Pour les ressources déployées sur Alibaba Cloud ou dans d'autres environnements cloud disposant d'adresses IP publiques, stockez et transmettez les données sensibles de manière sécurisée afin de réduire les risques de violation et de respecter les exigences de conformité. Pour de petits volumes de données sensibles, utilisez Key Management Service (KMS) pour chiffrer et déchiffrer les données en ligne. Cette rubrique décrit les scénarios, les prérequis et les procédures relatifs au chiffrement et au déchiffrement en ligne.

Périmètre

  • La taille des données pour une opération de chiffrement ou de déchiffrement symétrique ne doit pas dépasser 6 Ko par opération.

  • La taille des données pour une opération de chiffrement ou de déchiffrement asymétrique ne doit pas dépasser 1 Ko par opération.

Remarque

Une taille de données plus importante pour une seule opération de chiffrement augmente la probabilité d'échecs de transmission réseau et allonge le temps de transmission. Le temps nécessaire à une instance KMS pour chiffrer et déchiffrer les données augmente également.

Sécurité des clés

Avertissement

Ne stockez pas les clés de chiffrement dans le code frontal. Le code JavaScript frontal est entièrement transmis au navigateur de l'utilisateur ; les valeurs des clés peuvent être consultées et extraites via les outils de développement du navigateur. Qu'il s'agisse d'une clé symétrique, de la clé privée d'une clé asymétrique ou d'un AccessKey utilisé pour accéder à KMS, toute intégration dans le code frontal est considérée comme une compromission. En cas de fuite d'une clé, les attaquants peuvent déchiffrer tous les textes chiffrés historiques, rendant la protection par chiffrement inefficace.

L'approche recommandée consiste à conserver tous les matériaux de clé côté backend et à centraliser les opérations de chiffrement et de déchiffrement sur le backend :

  1. Le frontend transmet les données sensibles au serveur backend via HTTPS, où TLS garantit la confidentialité pendant la transmission.

  2. Le serveur backend appelle l'opération Encrypt ou AsymmetricEncrypt de KMS pour chiffrer les données et stocke le texte chiffré dans des bases de données ou d'autres systèmes de stockage.

  3. Lorsque le texte en clair est nécessaire, le backend appelle l'opération Decrypt ou AsymmetricDecrypt pour déchiffrer les données et renvoie le résultat au frontend selon les besoins.

Avec cette architecture, les matériaux de clé restent hébergés au sein de l'instance KMS et ne quittent jamais la limite de KMS. Le backend détient uniquement les identifiants nécessaires pour accéder à KMS, tandis que le frontend n'a jamais accès aux clés.

Préparation

Avant de commencer à appeler les API pour le chiffrement et le déchiffrement, effectuez les préparations suivantes.

Étape 1 : Acheter et activer une instance KMS

Achetez et activez une instance KMS (instance de gestion de clés logicielles ou instance de gestion de clés matérielles) en fonction de vos besoins métier et de vos exigences de conformité. Pour plus d'informations, consultez Acheter et activer une instance KMS.

Étape 2 : Créer une clé

Créez une clé dans l'instance KMS activée en fonction de votre scénario de chiffrement.

  • Clé symétrique : utilisée pour le chiffrement et le déchiffrement au sein d'un environnement de confiance.

  • Clé asymétrique : utilisée pour les scénarios qui traversent les limites de confiance, par exemple lorsque le client utilise une clé publique pour chiffrer et le serveur utilise une clé privée pour déchiffrer.

Pour plus d'informations, consultez Créer une clé.

Étape 3 : Préparer les identifiants d'accès et les autorisations

Cette rubrique utilise AccessKey à titre d'exemple. Pour plus d'informations sur les identifiants d'accès, consultez Créer des identifiants d'accès.

AccessKey

Avertissement

Par défaut, un compte Alibaba Cloud dispose des autorisations d'administrateur pour toutes les ressources, ce qui ne peut pas être modifié. Pour garantir la sécurité des ressources, nous vous recommandons d'utiliser un utilisateur RAM pour créer une paire AccessKey et de lui accorder uniquement les autorisations nécessaires.

  1. Connectez-vous à la console RAM. Sur la page Users, cliquez sur le nom de l'utilisateur RAM cible.

  2. Sous l'onglet Credential Management, dans la section AccessKey, cliquez sur Create AccessKey et suivez les instructions à l'écran.

  3. Accordez à l'utilisateur RAM les autorisations d'accès à KMS.

    • Méthode 1 : Configurer une politique basée sur l'identité

      Dans la colonne Actions de l'utilisateur RAM, cliquez sur Attach Policy pour associer une politique d'autorisation système intégrée pour KMS à l'utilisateur RAM. Pour plus d'informations sur les politiques d'autorisation système pour KMS, consultez Politiques système pour KMS.

      Remarque

      Vous pouvez également créer des politiques d'autorisation personnalisées. Pour plus d'informations, consultez Créer une politique personnalisée.

    • Méthode 2 : Configurer une politique basée sur les ressources

      KMS prend en charge les politiques basées sur les ressources qui accordent des autorisations d'accès pour des clés et des secrets individuels. Vous pouvez utiliser ces politiques pour contrôler quels comptes Alibaba Cloud, utilisateurs RAM et rôles RAM peuvent gérer ou utiliser les clés et les secrets KMS. Pour plus d'informations, consultez Politiques de clé et Politiques de secret.

Étape 4 : Obtenir les informations de connexion et le certificat CA

Lors de l'appel aux API, sélectionnez le point de terminaison de passerelle approprié en fonction de votre environnement réseau.

Remarque

Cette rubrique utilise par défaut la passerelle dédiée.

Fonctionnalité

Passerelle partagée

Passerelle dédiée

Endpoint

kms.<RegionId>.aliyuncs.com

<YOUR_KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com

Certificat CA

Non requis.

Requis.

Scénario applicable

Accès public, développement et test.

Accès interne VPC, environnements de production, performances et isolation supérieures.

Comment obtenir

Pour plus d'informations, consultez Alibaba Cloud SDK.

Sur la page des détails de l'instance, téléchargez le certificat CA de l'instance et obtenez l'endpoint VPC de l'instance.

Scénarios d'application

Scénario 1 : Applications déployées sur Alibaba Cloud

Les applications déployées sur Alibaba Cloud génèrent ou reçoivent des données sensibles en texte clair. Chiffrez ces données sensibles avant de les stocker dans des bases de données. Nous vous recommandons d'utiliser le chiffrement symétrique pour ce scénario.

Opérations API associées

Opération API

Description

Encrypt

Chiffre le texte en clair à l'aide d'une clé symétrique.

Decrypt

Déchiffre le texte chiffré à l'aide d'une clé symétrique.

Exemple de code

Chiffrer des données (Encrypt)

L'exemple de code suivant montre comment appeler l'opération Encrypt pour chiffrer du texte en clair en texte chiffré à l'aide d'une clé symétrique.

package com.aliyun.sample;

import com.aliyun.kms20160120.Client;
import com.aliyun.kms20160120.models.EncryptRequest;
import com.aliyun.kms20160120.models.EncryptResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class SymmetricEncryptSample {

    public static Client createClient() throws Exception {
        // Initialize the client with the AccessKey ID and AccessKey Secret obtained from environment variables.
        // Make sure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
        Config config = new Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        
        // Set the dedicated gateway endpoint.
        config.endpoint = "<Your-KMS-Instance-Endpoint>"; 
        // Set the CA certificate of the KMS instance.
        config.ca = "<Your-CA-Certificate-Content>";
        
        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        Client client = createClient();
        
        // The plaintext to encrypt.
        String plaintext = "this is a test message.";
        
        EncryptRequest encryptRequest = new EncryptRequest()
                // Set the ID of the symmetric key to use.
                .setKeyId("<Your-Symmetric-Key-Id>")
                // Set the plaintext to encrypt.
                .setPlaintext(plaintext);

        try {
            // Call the Encrypt operation.
            EncryptResponse response = client.encryptWithOptions(encryptRequest, new RuntimeOptions());
            
            // Get the Base64-encoded ciphertext from the response.
            String ciphertextBlob = response.getBody().getCiphertextBlob();
            
            System.out.println("Plaintext: " + plaintext);
            System.out.println("Ciphertext (Base64): " + ciphertextBlob);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Déchiffrer des données (Decrypt)

L'exemple de code suivant montre comment appeler l'opération Decrypt pour déchiffrer du texte chiffré en texte en clair.

package com.aliyun.sample;

import com.aliyun.kms20160120.Client;
import com.aliyun.kms20160120.models.DecryptRequest;
import com.aliyun.kms20160120.models.DecryptResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class SymmetricDecryptSample {

    public static Client createClient() throws Exception {
        // The client initialization logic is the same as the encryption sample.
        Config config = new Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "<Your-KMS-Instance-Endpoint>";
        config.ca = "<Your-CA-Certificate-Content>";
        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        Client client = createClient();
        
        // The ciphertext to decrypt. It must be a Base64-encoded string returned by the Encrypt operation.
        String ciphertextBlob = "<Ciphertext-From-Encryption-Step>";
        
        DecryptRequest decryptRequest = new DecryptRequest()
                // Set the ciphertext to decrypt.
                .setCiphertextBlob(ciphertextBlob);

        try {
            // Call the Decrypt operation.
            DecryptResponse response = client.decryptWithOptions(decryptRequest, new RuntimeOptions());
            
            // Get the decrypted plaintext from the response.
            String plaintext = response.getBody().getPlaintext();
            
            System.out.println("Ciphertext (Base64): " + ciphertextBlob);
            System.out.println("Decrypted Plaintext: " + plaintext);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Scénario 2 : Applications déployées sur et en dehors d'Alibaba Cloud

Nous vous recommandons d'utiliser le chiffrement asymétrique pour les scénarios où les données sont chiffrées en dehors d'Alibaba Cloud et déchiffrées sur Alibaba Cloud.

  • Les applications déployées en dehors d'Alibaba Cloud utilisent la clé publique pour chiffrer les données et envoient le texte chiffré aux applications sur Alibaba Cloud.

  • Après réception du texte chiffré, les applications sur Alibaba Cloud appellent l'instance KMS pour le déchiffrer à l'aide de la clé privée.

Opérations API associées

Opération API

Description

AsymmetricEncrypt

Chiffre les données à l'aide d'une clé asymétrique.

AsymmetricDecrypt

Déchiffre les données à l'aide d'une clé asymétrique.

Exemple de code

Chiffrer

package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * <b>description</b> :
     * <p>Initialize the account client with credentials</p>
     * @return Client
     * 
     * @throws Exception
     */
    public static com.aliyun.kms20160120.Client createClient() throws Exception {
        // We recommend using a more secure AK-free method for production code. For credential configuration, see: https://www.alibabacloud.com/help/document_detail/378657.html.
         com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Required. Make sure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Make sure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com";
        //KMS instance CA certificate
        config.ca = "-----BEGIN CERTIFICATE-----MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCS****";
        return new com.aliyun.kms20160120.Client(config);
    }

    public static void main(String[] args) throws Exception {    
        com.aliyun.kms20160120.Client client = Sample.createClient();
         com.aliyun.kms20160120.models.AsymmetricEncryptRequest asymmetricEncryptRequest = new com.aliyun.kms20160120.models.AsymmetricEncryptRequest()
                .setPlaintext("test")
                .setKeyId("a06e2410-*****-330777ee1825")
                .setKeyVersionId("key-hzz65f17868e6cl0n****")
                .setAlgorithm("RSAES_OAEP_SHA_256");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            com.aliyun.kms20160120.models.AsymmetricEncryptResponse resp = client.asymmetricEncryptWithOptions(asymmetricEncryptRequest, runtime);
            System.out.println(new com.google.gson.Gson().toJson(resp));
        } catch (TeaException error) {
            // This is for demonstration only. Handle exceptions carefully and do not ignore them in production.
            // Error message
            System.out.println(error.getMessage());
            // Diagnostic URL
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // This is for demonstration only. Handle exceptions carefully and do not ignore them in production.
            // Error message
            System.out.println(error.getMessage());
            // Diagnostic URL
            System.out.println(error.getData().get("Recommend"));
        }        
    }
}

Déchiffrer

public class Sample {
 
    /**
     * <b>description</b> :
     * <p>Initialize the account client with credentials</p>
     * @return Client
     * 
     * @throws Exception
     */
    public static com.aliyun.kms20160120.Client createClient() throws Exception {
       // Code leakage may lead to AccessKey leakage and threaten the security of all resources under the account. The following code is for reference only.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Required. Make sure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Make sure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Dedicated gateway endpoint
        config.endpoint = "kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com";
        //KMS instance CA certificate
        config.ca = "-----BEGIN CERTIFICATE-----MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCS****";
        return new com.aliyun.kms20160120.Client(config);
    }
 
    public static void main(String[] args_) throws Exception {
        
       public static void main(String[] args_) throws Exception {
        
        com.aliyun.kms20160120.Client client = Sample.createClient();
        com.aliyun.kms20160120.models.AsymmetricDecryptRequest asymmetricDecryptRequest = new com.aliyun.kms20160120.models.AsymmetricDecryptRequest()
                .setKeyId("a06e2410-*****-330777ee1825")
                .setKeyVersionId("key-hzz65f17868e6cl0n****")
                .setAlgorithm("RSAES_OAEP_SHA_256")
                .setCiphertextBlob("FV9i23PQdpGPvc*********MA==");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            com.aliyun.kms20160120.models.AsymmetricDecryptResponse resp = client.asymmetricDecryptWithOptions(asymmetricDecryptRequest, runtime);
            System.out.println(new com.google.gson.Gson().toJson(resp));
        } catch (TeaException error) {
            // This is for demonstration only. Handle exceptions carefully and do not ignore them in production.
            // Error message
            System.out.println(error.getMessage());
            // Diagnostic URL
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // This is for demonstration only. Handle exceptions carefully and do not ignore them in production.
            // Error message
            System.out.println(error.getMessage());
            // Diagnostic URL
            System.out.println(error.getData().get("Recommend"));
        }        
    }
}