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