Tous les produits
Search
Centre de documentation

Data Security Center:Integrate EncJDBC

Dernière mise à jour :Oct 13, 2026

Après avoir configuré le chiffrement des colonnes pour les données sensibles dans les tables de bases de données RDS MySQL, RDS PostgreSQL, PolarDB MySQL ou PolarDB PostgreSQL, utilisez le pilote EncJDBC pour vous connecter à la base de données si votre application Java doit accéder au texte en clair de ces colonnes chiffrées. Cette rubrique explique comment utiliser EncJDBC pour se connecter à une base de données et accéder aux données en clair des colonnes chiffrées.

Prérequis

  • Activez le chiffrement des colonnes pour la base de données cible et définissez l'autorisation de texte chiffré du compte de base de données cible sur Ciphertext Permission (JDBC Decryption). Pour obtenir des instructions détaillées sur la configuration du chiffrement des colonnes de la base de données et des autorisations des comptes, consultez la rubrique Configurer le chiffrement des colonnes de la base de données.

  • Récupérez les informations de connexion à la base de données chiffrée : endpoint, port, nom de la base de données, compte de base de données et mot de passe.

Informations générales

La fonctionnalité de chiffrement des colonnes applique une protection dynamique en sortie à des colonnes sensibles spécifiques de votre base de données, améliorant ainsi la sécurité des données. Après l'activation de cette fonctionnalité, le système contrôle les résultats des requêtes en fonction de la politique d'accès du compte de base de données :

  • Les comptes disposant des Plaintext Permissions peuvent afficher directement les données brutes.

  • Les comptes configurés avec l'option Ciphertext Permission (JDBC Decryption) reçoivent un texte chiffré, mais peuvent le restaurer automatiquement en texte clair à l'aide du pilote JDBC toujours confidentiel d'Alibaba Cloud (EncJDBC) et en fournissant une clé de chiffrement principale (MEK) correspondant à la politique de chiffrement.

  • Les comptes configurés avec l'option Ciphertext Permission (No Decryption Permission) ne peuvent voir que le texte chiffré et ne peuvent pas le déchiffrer.

Ce mécanisme garantit une protection efficace des données sensibles lors de la phase de sortie. Même si les données sont exportées ou interceptées, les parties non autorisées ne peuvent pas les lire.

Générer une MEK

Lorsque vous activez le chiffrement des colonnes à l'aide de la méthode Local key pour une colonne, la passerelle de chiffrement des colonnes DSC chiffre les champs sensibles à l'aide d'une clé contrôlée avant de renvoyer les résultats de la requête au client. À l'exception des comptes disposant de l'autorisation Plaintext permission, tous les autres comptes reçoivent un texte chiffré lorsqu'ils interrogent cette colonne.

Pour accéder ultérieurement au texte clair à l'aide d'un compte disposant de l'autorisation Ciphertext permission (JDBC decryption), fournissez et enregistrez votre propre MEK lors de la configuration initiale du chiffrement des colonnes. Seule une MEK correspondant à la politique de chiffrement permet au pilote EncJDBC de déchiffrer correctement les champs chiffrés dans les résultats de requête côté client.

  • Plage de valeurs : une chaîne hexadécimale de 16 octets, soit exactement 32 caractères.

  • Rôle de la MEK : la MEK est l'identifiant racine qui autorise le client EncJDBC à déchiffrer les champs chiffrés dans les résultats de requête. Elle protège la clé réelle utilisée pour chiffrer les résultats de requête.

  • Responsabilité en matière de sécurité : Alibaba Cloud ne stocke, ne sauvegarde ni n'héberge votre MEK. Protégez-la à l'aide d'une solution de gestion des clés sécurisée telle que KMS.

  • Avertissement important : si vous perdez votre MEK, tous les résultats de requête historiques chiffrés selon cette politique deviennent définitivement indéchiffrables.

Selon la Encryption Method sélectionnée dans votre configuration de chiffrement des colonnes de la base de données, obtenez une KMS Key ou générez une Local Key à utiliser comme MEK pour déchiffrer la base de données correspondante.

Clé KMS

Important

Assurez-vous que le service KMS est disponible lorsque vous utilisez une clé KMS. Sinon, le pilote client toujours confidentiel EncJDBC ne pourra pas fonctionner.

Obtenez l'endpoint de l'instance KMS propriétaire de la clé KMS sélectionnée dans votre configuration de chiffrement des colonnes de la base de données, ainsi que l'AccessKey ID et l'AccessKey secret du compte Alibaba Cloud ou de l'utilisateur RAM (qui doit disposer de l'autorisation de déchiffrement KMS) pour lire cette clé KMS depuis le client. Suivez les étapes ci-dessous :

  1. Connectez-vous à la console à l'aide d'un compte Alibaba Cloud ou d'un utilisateur RAM.

  2. Si vous utilisez un utilisateur RAM, accordez-lui l'autorisation de déchiffrement KMS.

    1. Créer une stratégie personnalisée. Utilisez le contenu de stratégie suivant :

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "KMS:Decrypt",
                  "Resource": "*"
              }
          ]
      }
    2. Attachez la stratégie personnalisée créée à l'utilisateur RAM spécifié. Pour plus de détails, consultez la rubrique Gérer les autorisations des utilisateurs RAM.

  3. Obtenez l'endpoint de l'instance KMS.

    • Par défaut, les clés d'une instance KMS n'autorisent l'accès qu'à partir des réseaux VPC. Sur la page de gestion des instances KMS, recherchez votre instance KMS cible, cliquez sur Actions, puis sur Details, et affichez l'endpoint VPC dans l'onglet Basic Information.

    • Pour accéder aux clés via le réseau public, activez l'accès au réseau public, puis affichez l'endpoint public. Pour plus de détails, consultez la rubrique Activer l'accès au réseau public.

  4. Obtenez les identifiants d'accès.

    Enregistrez l'AccessKey ID et l'AccessKey secret lors de la création de l'AccessKey pour votre compte Alibaba Cloud ou votre utilisateur RAM. Pour plus de détails, consultez la rubrique Créer un AccessKey.

Clé locale

Lorsque la Encryption Method dans votre configuration de chiffrement des colonnes de la base de données est définie sur Local Key, générez une MEK. Par exemple : 00112233445566778899aabbccddeeff.

Les méthodes de génération courantes incluent les générateurs de mots de passe ou les fonctions aléatoires des langages de programmation.

Par exemple :

  • Sous Linux, utilisez l'outil OpenSSL intégré en exécutant openssl rand -hex 16 pour générer une clé.

  • Sous Windows, installez le package logiciel OpenSSL.

Instructions d'intégration du client

Important

Utilisez JDK 1.8 ou une version ultérieure pour Java.

Côté client, remplacez le pilote de connexion à la base de données par EncJDBC, mettez à jour l'URL de connexion à la base de données et spécifiez la MEK pour accéder au texte clair des colonnes chiffrées de la base de données.

1. Installer les dépendances

Ajoutez la dépendance suivante au fichier de configuration de votre projet Maven pom.xml.

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-cls-jdbc</artifactId>
    <version>1.0.10-6</version>
</dependency>

2. Configurer la MEK pour se connecter à la base de données

Les méthodes suivantes décrivent comment configurer la MEK : configuration des propriétés JDBC, configuration par fichier et configuration par URL. Si vous configurez plusieurs méthodes simultanément, l'ordre de priorité est le suivant : configuration des propriétés JDBC > configuration par fichier > configuration par URL.

Remarque
  • Dans la configuration par URL, séparez plusieurs paramètres par &.

  • Dans toutes les configurations et méthodes de connexion ci-dessous, la MEK est traitée localement sur le client et envoyée en toute sécurité au serveur à l'aide du chiffrement sous enveloppe pour éviter la fuite de la MEK.

Choisissez de vous connecter à la base de données à l'aide d'une clé locale ou d'une clé KMS en fonction de la méthode de chiffrement dans votre configuration de chiffrement des colonnes de la base de données.

Se connecter à la base de données à l'aide d'une clé KMS

Important
  • Si vous utilisez des identifiants temporaires STS pour récupérer une MEK gérée par KMS, utilisez le SDK STS pour obtenir le jeton STS des identifiants temporaires. Pour des exemples de SDK STS, consultez la rubrique Présentation du SDK STS.

  • Ne codez pas en dur les identifiants d'accès (AccessKey ID et AccessKey secret) directement dans le code de votre application. Cet exemple utilise des variables d'environnement système pour gérer les identifiants d'accès. Pour plus de détails, consultez la rubrique Configurer les variables d'environnement sous Linux, macOS et Windows.

Configuration des propriétés JDBC

JDBC standard vous permet de définir des propriétés personnalisées à l'aide de Properties lors de la connexion. L'exemple suivant montre comment configurer les propriétés JDBC et exécuter JDBC :

// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
// props.setProperty("ALIBABA_CLOUD_STS_TOKEN", "stsToken");
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...

Configuration par URL

Vous pouvez intégrer les paramètres de récupération de la clé KMS directement dans l'URL, comme indiqué ci-dessous :

// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
// Connection URL format for MySQL.
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint);
// With STS token.
// String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s&ALIBABA_CLOUD_STS_TOKEN=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint, stsToken);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...

Se connecter à la base de données à l'aide d'une clé locale

Configuration des propriétés JDBC

JDBC standard vous permet de définir des propriétés personnalisées à l'aide de Properties lors de la connexion. L'exemple suivant montre comment configurer les propriétés JDBC et exécuter JDBC :

// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff"; 
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...

Configuration par fichier

Vous pouvez importer des paramètres tels que la MEK requise via un fichier de configuration.

Remarque

La configuration par fichier s'applique uniquement aux MEK de type clé locale.

Vous pouvez définir une property nommée encJdbcConfigFile dans votre projet et définir sa valeur sur le chemin du fichier de configuration (par défaut, le fichier encjdbc.conf est utilisé). Le contenu du fichier de configuration est le suivant :

MEK=00112233445566778899aabbccddeeff

Vous pouvez placer le fichier de configuration à l'un des deux emplacements suivants :

  • Placez le fichier dans le répertoire resources de votre projet, comme indiqué ci-dessous :

    src
      main
        java
        resources
          encjdbc.conf
  • Placez le fichier dans le répertoire racine du projet (le répertoire d'exécution du programme).

Après avoir configuré le fichier, aucune configuration supplémentaire n'est nécessaire dans votre code, comme indiqué ci-dessous :

// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...

Configuration par URL

Vous pouvez intégrer des paramètres tels que la MEK directement dans l'URL, comme indiqué ci-dessous :

// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
 // Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s?MEK=%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s?MEK=%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...

3. Interroger les données en clair des colonnes chiffrées

Une fois la connexion à la base de données établie avec succès, utilisez-la comme pour une requête JDBC standard. EncJDBC déchiffre automatiquement les colonnes chiffrées et renvoie les données en texte clair.

Exemple de code :

// Execute the query.
// Create a query statement.
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
// Traverse the result set.
while (resultSet.next()) {
    for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
        System.out.print(rs.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

Exemple de code complet

En utilisant les propriétés JDBC pour configurer une MEK de type clé locale, cet exemple interroge les données en texte clair des colonnes chiffrées dans une base de données RDS MySQL à l'aide d'un compte de base de données disposant de l'autorisation Ciphertext Permission (JDBC Decryption).

Pour plus d'informations sur la configuration de la base de données dans l'exemple suivant, consultez la rubrique Vérifier les résultats du chiffrement des colonnes dans l'exemple de chiffrement des colonnes de la base de données RDS MySQL.

Remarque

Cet exemple utilise la version 3.9.9 de Maven et l'outil de développement IntelliJ IDEA Community Edition 2024.1.2.

import java.sql.*;
import java.util.Properties;
public class EncryptedColumnAccess {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // Update the following connection information (hostname, port, database name, username, password) with your instance details.
        String hostname = "rm-******.mysql.rds.aliyuncs.com";
        String port = "3306";
        String dbname = "sddp_em_db";
        String username = "sddp_em03";
        String password = "******";
        // Example only. Use a more complex key in production.
        String mek="00112233445566778899aabbccddeeff";
        Properties props = new Properties();
        props.setProperty("user", username);
        props.setProperty("password", password);
        props.setProperty("MEK", mek);
        String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
        // Load the EncJDBC driver.
        Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
        // Get the database connection.
        Connection connection = DriverManager.getConnection(dbUrl, props);
        // Execute a query.
        try {
            // Create a query statement.
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            // Traverse the result set.
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                String phone = resultSet.getString("phone");
                // Process other fields based on your table schema.
                System.out.println("ID: " + id + ", Name: " + name + ", Phone: " + phone);
            }
            // Close resources.
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Exemple de sortie :

ID: 1, Name: username008808, Phone: 15xxx95
ID: 2, Name: username187643, Phone: 15xxx81