Después de habilitar el cifrado de columnas en una base de datos ApsaraDB RDS for MySQL o PolarDB for MySQL, utilice el controlador alibabacloud-encdb-mysql-go-client en su aplicación Go para acceder a los datos en texto plano desde las columnas cifradas.
Contexto
El cifrado de columnas mejora la seguridad de los datos al almacenarlos como texto cifrado en columnas específicas. Los clientes autorizados pueden acceder a estos datos de forma transparente como texto plano.
Alibaba Cloud proporciona alibabacloud-encdb-mysql-go-client, un controlador de Go del lado del cliente. Para acceder a una base de datos cifrada, use este controlador para conectarse y especifique una clave maestra de cifrado (MEK) en la URL de conexión a la base de datos. El controlador descifra automáticamente el texto cifrado y devuelve los datos en texto plano.
El cliente y el servidor utilizan un protocolo seguro de cifrado asimétrico para transmitir la MEK. Este proceso establece una clave compartida entre ambos para el cifrado simétrico seguro de los datos.
Rango de valores: cadena hexadecimal de 16 bytes con exactamente 32 caracteres.
La MEK es la credencial raíz que autoriza a su cliente a acceder a los datos cifrados. Por razones de seguridad, la base de datos cifrada no almacena ni gestiona su MEK, tampoco ofrece servicios de generación o copia de seguridad de la MEK. Usted es responsable de generar su propia MEK. La protección de la MEK es fundamental para la seguridad de su base de datos. Se recomienda hacer una copia de seguridad de su MEK en una ubicación segura.
Requisitos previos
Habilite el cifrado de columnas para la base de datos destino y establezca el permiso de texto cifrado para la cuenta de la base de datos destino en Ciphertext Permission (JDBC Decryption). Para obtener instrucciones detalladas sobre cómo configurar el cifrado de columnas de la base de datos y los permisos de la cuenta, consulte Configure database column encryption.
Obtenga la información de conexión de la base de datos cifrada: endpoint, puerto, nombre de la base de datos, cuenta de la base de datos y contraseña.
Notas de uso
Almacene de forma segura su clave maestra de cifrado (
MEK).Se requiere la versión 1.18 o posterior de Go.
Integración del cliente
1. Obtener el controlador
alibabacloud-encdb-mysql-go-client es totalmente compatible con el Go MySQL Driver de la comunidad y la interfaz estándar de Go database/sql/driver, lo que permite integrarlo en su aplicación sin modificar el código.
El controlador es de código abierto en GitHub. Para más información, consulte alibabacloud-encdb-mysql-go-client.
Para obtener el controlador, ejecute el siguiente comando:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
2. Configurar MEK y conectar
Use un ampersand (
&) para unir varios parámetros en la URL.El cliente procesa la
MEKlocalmente y utiliza el cifrado de sobre para enviarla de forma segura al servidor, lo que garantiza que laMEKno se filtre.
Código de ejemplo:
// Replace the placeholders with your actual endpoint (hostname), port number (port), database name (dbname), username, and password.
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}
3. Consultar datos en texto plano
Código de ejemplo:
// Send a query.
rows, err := db.Query("SELECT * FROM sddp_test_mask")
if err != nil {
log.Fatalf("Failed to query data: %v", err)
}
// Make sure to close the result set after use.
defer rows.Close()
// Define variables to store the data for each row.
var id int
var name string
var password string
var age int
// Iterate over each row of data.
for rows.Next() {
// Scan the data of the current row into variables.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Failed to scan row: %v", err)
}
// Print the data of the current row.
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
Ejemplo de código completo
El siguiente ejemplo utiliza una cuenta de base de datos con el permiso Ciphertext Permission (JDBC Decryption) para consultar datos en texto plano desde columnas cifradas en una base de datos PolarDB for MySQL.
La configuración de la base de datos utilizada en este ejemplo se detalla en la sección Ejemplo de cifrado de columnas para una base de datos PolarDB for MySQL del tema 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 endpoint (hostname), port number (port), database name (dbname), username, and password.
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)
}
// Make sure to close the result set after use.
defer rows.Close()
// Define variables to store the data for each row.
var id int
var name string
var password string
var age int
// Iterate over each row of data.
for rows.Next() {
// Scan the data of the current row into variables.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Failed to scan row: %v", err)
}
// Print the data of the current row.
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
}
Después de ejecutar el código, la salida descifrada es similar a a continuación:
read data: id=1, name=2clxxx, password=xxx, age=3
read data: id=2, name=RZlxxx6Z=, password=)xxxv9>, age=4
read data: id=3, name=!xxxrm, password=kxxxS, age=5