O alibabacloud-encdb-mysql-go-client é um driver Go para criptografia de colunas no lado do cliente. Ele intercepta os resultados das consultas e descriptografa automaticamente o texto cifrado, permitindo que sua aplicação leia colunas sensíveis como texto simples sem modificar as consultas SQL. Para ativar a descriptografia, especifique sua chave mestra de criptografia (MEK) na URL de conexão.
Pré-requisitos
Antes de começar, verifique se você:
Executou uma varredura de detecção de dados sensíveis para identificar as colunas a criptografar. Para mais informações, consulte Detecção de dados sensíveis.
Ativou a criptografia de colunas no banco de dados de destino e concedeu a Ciphertext Permission (JDBC Decryption) à conta do banco de dados. Para mais informações, consulte Criptografia de colunas.
Tem os seguintes detalhes de conexão da instância RDS com o recurso de banco de dados sempre confidencial ativado: host, porta, nome do banco de dados, nome de usuário e senha.
Como funciona
O driver conecta-se ao banco de dados usando sua MEK como credencial raiz de descriptografia. Durante a conexão, cliente e servidor realizam uma troca de chaves assimétricas para estabelecer uma chave de sessão simétrica compartilhada. A transmissão de todos os dados subsequentes usa criptografia simétrica.
Integrar o driver
Etapa 1: Instalar o driver
O alibabacloud-encdb-mysql-go-client é compatível com o Go-MySQL-Driver e implementa a interface padrão database/sql/driver, portanto, não requer alterações no SQL. É necessário Go 1.18 ou posterior.
Execute o comando a seguir para instalar o driver:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
O código-fonte está disponível no repositório alibabacloud-encdb-mysql-go-client no GitHub.
Etapa 2: Gerar uma MEK
A MEK deve ser uma string hexadecimal de 32 caracteres (16 bytes). O recurso de banco de dados sempre confidencial não gera, armazena nem faz backup da sua MEK — você é responsável por gerá-la e armazená-la com segurança.
Gere uma MEK aleatória usando o OpenSSL:
-
Linux ou macOS (OpenSSL integrado):
openssl rand -hex 16 Windows: Instale o OpenSSL for Windows e execute o mesmo comando.
O comando gera uma string de 32 caracteres, como 00112233445566778899aabbccddeeff.
A MEK é a credencial raiz usada para autorizar um cliente a acessar dados criptografados. Para garantir a segurança, o recurso de banco de dados sempre confidencial não gera, armazena nem faz backup da sua MEK. Gere manualmente uma MEK e assegure seu armazenamento seguro. Para proteger bancos de dados com o recurso de banco de dados sempre confidencial ativado, armazene e gerencie a MEK adequadamente. Recomendamos fazer backup da sua MEK.
Etapa 3: Conectar-se ao banco de dados
O driver registra-se com o nome encmysql. Abra uma conexão usando sql.Open com encmysql como nome do driver e anexe MEK=<your-mek> à URL de conexão.
Formato da URL de conexão:
<username>:<password>@tcp(<host>:<port>)/<dbname>?MEK=<mek-value>
|
Espaço reservado |
Descrição |
|
|
Nome de usuário do banco de dados |
|
|
Senha do banco de dados |
|
|
Endpoint (nome do host) da instância RDS |
|
|
Número da porta |
|
|
Nome do banco de dados |
|
|
MEK hexadecimal de 32 caracteres |
Use & para anexar parâmetros adicionais do driver: ?MEK=<value>&<param>=<value>.
A MEK é transmitida ao servidor usando criptografia de envelope. Não registre em log nem exponha o valor da MEK em mensagens de erro ou na saída da aplicação.
Exemplo:
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}
Etapa 4: Consultar colunas criptografadas
Após conectar-se, consulte colunas criptografadas usando chamadas padrão do database/sql. O driver descriptografa os 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)
}
Exemplo completo
O exemplo a seguir conecta-se a um banco de dados PolarDB for MySQL usando uma conta com a ciphertext permission (JDBC decryption) e lê os valores em texto simples das colunas criptografadas.
Para obter detalhes sobre a configuração de criptografia de colunas usada aqui, consulte a seção Column encryption in a PolarDB for MySQL database em Criptografia de colunas.
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)
}
}
Após a execução do código anterior, o resultado descriptografado retornado será semelhante ao seguinte:
