Tous les produits
Search
Centre de documentation

Database Autonomy Service:Intégrer le driver Go pour le chiffrement des colonnes

Dernière mise à jour :Aug 12, 2026

alibabacloud-encdb-mysql-go-client est un driver Go dédié au chiffrement des colonnes côté client. Il intercepte les résultats des requêtes et déchiffre automatiquement le texte chiffré. Votre application lit ainsi les colonnes sensibles en texte clair sans modification des requêtes SQL. Pour activer le déchiffrement, spécifiez votre clé principale de chiffrement (MEK) dans l'URL de connexion.

Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Exécuté une analyse de détection des données sensibles pour identifier les colonnes à chiffrer. Pour plus d'informations, consultez Détection des données sensibles.

  • Activé le chiffrement des colonnes pour la base de données cible et accordé l'Ciphertext Permission (JDBC Decryption) au compte de la base de données. Pour plus d'informations, consultez Chiffrement des colonnes.

  • Les informations de connexion suivantes pour l'instance RDS avec la fonctionnalité de base de données toujours confidentielle activée : hôte, port, nom de la base de données, nom d'utilisateur et mot de passe.

Fonctionnement

Le driver se connecte à la base de données en utilisant votre MEK comme identifiant racine de déchiffrement. Lors de la connexion, le client et le serveur effectuent un échange de clés asymétriques pour établir une clé de session symétrique partagée. Toutes les données ultérieures sont transmises via un chiffrement symétrique.

Intégration du driver

Étape 1 : Installer le driver

alibabacloud-encdb-mysql-go-client est compatible avec Go-MySQL-Driver et implémente l'interface standard database/sql/driver. Aucune modification SQL n'est nécessaire. Go 1.18 ou version ultérieure est requis.

Exécutez la commande suivante pour installer le driver :

go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest

Le code source est disponible sur GitHub dans le dépôt alibabacloud-encdb-mysql-go-client.

Étape 2 : Générer une MEK

La MEK doit être une chaîne hexadécimale de 32 caractères (16 octets). La fonctionnalité de base de données toujours confidentielle ne génère, ne stocke ni ne sauvegarde votre MEK. Il vous appartient de la générer et de la conserver en toute sécurité.

Générez une MEK aléatoire à l'aide d'OpenSSL :

  • Linux ou macOS (OpenSSL intégré) :

    openssl rand -hex 16
  • Windows : Installez OpenSSL for Windows, puis exécutez la même commande.

Cette commande produit une chaîne de 32 caractères telle que 00112233445566778899aabbccddeeff.

Avertissement

Une MEK constitue l'identifiant racine permettant d'autoriser un client à accéder aux données chiffrées. Afin de garantir la sécurité, la fonctionnalité de base de données toujours confidentielle ne génère, ne stocke ni ne sauvegarde votre MEK. Vous devez générer manuellement cette clé et veiller à son stockage sécurisé. Pour assurer la protection des bases de données où cette fonctionnalité est activée, conservez et gérez la MEK de manière sûre. Nous vous recommandons également de la sauvegarder.

Étape 3 : Se connecter à la base de données

Le driver s'enregistre sous le nom encmysql. Ouvrez une connexion via sql.Open en indiquant encmysql comme nom de driver, puis ajoutez MEK=<your-mek> à l'URL de connexion.

Format de l'URL de connexion :

<username>:<password>@tcp(<host>:<port>)/<dbname>?MEK=<mek-value>
Espace réservé Description
<username> Nom d'utilisateur de la base de données
<password> Mot de passe de la base de données
<host> Endpoint (nom d'hôte) de l'instance RDS
<port> Numéro de port
<dbname> Nom de la base de données
<mek-value> MEK hexadécimale de 32 caractères

Utilisez & pour ajouter d'autres paramètres du driver : ?MEK=<value>&<param>=<value>.

La transmission de la MEK au serveur s'effectue par chiffrement d'enveloppe. Ne journalisez jamais cette valeur et ne l'exposez pas dans les messages d'erreur ou les sorties applicatives.

Exemple :

db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
    panic(err)
}

Étape 4 : Interroger les colonnes chiffrées

Une fois connecté, interrogez les colonnes chiffrées au moyen des appels standards database/sql. Le driver déchiffre les résultats de manière transparente.

// Run a SELECT query against a table with encrypted columns.
rows, err := db.Query("SELECT * FROM sddp_test_mask")
if err != nil {
    log.Fatalf("Failed to query data: %v", err)
}
// Always close the result set when done.
defer rows.Close()

var id int
var name string
var password string
var age int

for rows.Next() {
    err := rows.Scan(&id, &name, &password, &age)
    if err != nil {
        log.Fatalf("Failed to scan row: %v", err)
    }
    fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}

Exemple complet

L'exemple ci-dessous se connecte à une base de données PolarDB for MySQL via un compte disposant de l'ciphertext permission (JDBC decryption) et lit les valeurs en clair des colonnes chiffrées.

Pour plus de détails sur la configuration du chiffrement des colonnes utilisée ici, reportez-vous à la section Column encryption in a PolarDB for MySQL database de la rubrique Chiffrement des colonnes.

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)

func main() {
    // Replace the placeholders with your actual connection details.
    db, err := sql.Open("encmysql", "sddp_02:He******4@tcp(polar***.rwlb.rds.aliyuncs.com:3306)/sddp_test?MEK=00112233445566778899aabbccddeeff")
    if err != nil {
        panic(err)
    }

    rows, err := db.Query("SELECT * FROM user3 LIMIT 3")
    if err != nil {
        log.Fatalf("Failed to query data: %v", err)
    }

    // Always close the result set when done.
    defer rows.Close()

    var id int
    var name string
    var password string
    var age int

    for rows.Next() {
        err := rows.Scan(&id, &name, &password, &age)
        if err != nil {
            log.Fatalf("Failed to scan row: %v", err)
        }
        fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
    }
}

L'exécution du code précédent retourne un résultat déchiffré similaire à l'exemple suivant.

image

Rubriques connexes