Todos os produtos
Search
Central de documentação

Database Autonomy Service:Integrar o driver Go para criptografia de colunas

Última atualização: Jun 27, 2026

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.

Aviso

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

<username>

Nome de usuário do banco de dados

<password>

Senha do banco de dados

<host>

Endpoint (nome do host) da instância RDS

<port>

Número da porta

<dbname>

Nome do banco de dados

<mek-value>

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:

image

Tópicos relacionados