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.
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 |
|
|
Nombre de usuario de la base de datos |
|
|
Contraseña de la base de datos |
|
|
Endpoint (nombre de host) de la instancia RDS |
|
|
Número de puerto |
|
|
Nombre de la base de datos |
|
|
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.
