Todos los productos
Search
Centro de documentos

Database Autonomy Service:Integrar el controlador de Go para el cifrado de columnas

Última actualización: Sep 05, 2026

alibabacloud-encdb-mysql-go-client es un controlador de Go para el cifrado de columnas en el lado del cliente. Este controlador intercepta los resultados de las consultas y descifra automáticamente el texto cifrado, lo que permite que su aplicación lea columnas sensibles como texto sin formato sin modificar sus consultas SQL. Para habilitar el descifrado, especifique su clave maestra de cifrado (MEK) en la URL de conexión.

Requisitos previos

Antes de empezar, asegúrese de cumplir con a continuación:

  • Ejecute un análisis de detección de datos sensibles para identificar las columnas por cifrar. Para obtener más información, consulte Detección de datos sensibles.

  • Habilite el cifrado de columnas para la base de datos destino y otorgue el Ciphertext Permission (JDBC Decryption) a la cuenta de la base de datos. Para obtener más información, consulte Cifrado de columnas.

  • A continuación detalles de conexión para la instancia RDS con la función de base de datos siempre confidencial habilitada: host, puerto, nombre de la base de datos, nombre de usuario y contraseña.

Funcionamiento

El controlador se conecta a la base de datos mediante su MEK como credencial raíz de descifrado. Al establecer la conexión, el cliente y el servidor realizan un intercambio de claves asimétricas para generar una clave de sesión simétrica compartida. Todos los datos posteriores se transmiten mediante cifrado simétrico.

Integración del controlador

Paso 1: Instalación del controlador

alibabacloud-encdb-mysql-go-client es compatible con Go-MySQL-Driver e implementa la interfaz estándar database/sql/driver, por lo que no se requieren cambios en SQL. Se requiere Go 1.18 o posterior.

Ejecute a continuación comando para instalar el controlador:

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

El código fuente está disponible en alibabacloud-encdb-mysql-go-client en GitHub.

Paso 2: Generación de una MEK

La MEK debe ser una cadena hexadecimal de 32 caracteres (16 bytes). La función de base de datos siempre confidencial no genera, almacena ni respalda su MEK; usted es responsable de generarla y almacenarla de forma segura.

Genere una MEK aleatoria mediante OpenSSL:

  • Linux o macOS (OpenSSL integrado):

    openssl rand -hex 16
  • Windows: Instale OpenSSL for Windows y ejecute el mismo comando.

El comando genera una cadena de 32 caracteres, como 00112233445566778899aabbccddeeff.

Aviso

Una MEK es la credencial raíz que se utiliza para autorizar a un cliente a acceder a datos cifrados. Para garantizar la seguridad, la función de base de datos siempre confidencial no genera, almacena ni respalda su MEK. Debe generar manualmente una MEK y asegurarse de que se almacene de forma segura. Para proteger las bases de datos con la función de base de datos siempre confidencial habilitada, es obligatorio almacenar y gestionar la MEK de manera segura. Se recomienda respaldar su MEK.

Paso 3: Conexión a la base de datos

El controlador se registra con el nombre encmysql. Abra una conexión mediante sql.Open con encmysql como nombre del controlador y agregue MEK=<your-mek> a la URL de conexión.

Formato de la URL de conexión:

<username>:<password>@tcp(<host>:<port>)/<dbname>?MEK=<mek-value>

Marcador

Descripción

<username>

Nombre de usuario de la base de datos

<password>

Contraseña de la base de datos

<host>

Endpoint (nombre de host) de la instancia RDS

<port>

Número de puerto

<dbname>

Nombre de la base de datos

<mek-value>

MEK hexadecimal de 32 caracteres

Utilice & para agregar parámetros adicionales del controlador: ?MEK=<value>&<param>=<value>.

La MEK se transmite al servidor mediante cifrado de sobre. No registre ni exponga el valor de la MEK en mensajes de error o en la salida de la aplicación.

Ejemplo:

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

Paso 4: Consulta de columnas cifradas

Después de conectarse, consulte las columnas cifradas mediante llamadas estándar de database/sql. El controlador descifra los resultados de forma 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)
}

Ejemplo completo

A continuación ejemplo se conecta a una base de datos PolarDB for MySQL mediante una cuenta con el ciphertext permission (JDBC decryption) y lee los valores en texto sin formato de las columnas cifradas.

Para obtener detalles sobre la configuración de cifrado de columnas utilizada aquí, consulte la sección Column encryption in a PolarDB for MySQL database en Column encryption.

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

Al ejecutar el código anterior, se obtiene un resultado descifrado similar a continuación.

image

Temas relacionados