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, para que sua aplicação leia colunas confidenciais como texto simples sem modificar suas consultas SQL. Para ativar a descriptografia, especifique sua chave mestra de criptografia (MEK) na URL de conexão.
Pré-requisitos
Você executou uma verificação de detecção de dados confidenciais para encontrar colunas que requerem criptografia.
Você configurou a criptografia de colunas para o banco de dados de destino e definiu a permissão da conta do banco de dados como Ciphertext Permission (JDBC Decryption). Para obter instruções detalhadas, consulte criptografia de colunas.
Detalhes de conexão da instância: nome do host, porta, nome do banco de dados, nome de usuário e senha.
Configurar a MEK
A chave é transmitida do cliente para o servidor de banco de dados por meio de um protocolo de criptografia assimétrica seguro, de modo que o servidor e o cliente compartilham a mesma chave, possibilitando assim que os dados sejam transmitidos com segurança por meio de criptografia simétrica.
Intervalo de valores: Uma cadeia hexadecimal de 16 bytes, com exatamente 32 caracteres.
Aviso importante: Se você perder sua MEK, todos os resultados históricos de consultas criptografados sob esta política se tornarão permanentemente indecifráveis.
Você pode usar ferramentas de geração de chaves ou as funções aleatórias em diversas linguagens de programação para gerar a MEK. Por exemplo:
Linux: Execute
openssl rand -hex 16.Windows: Instale e use a ferramenta OpenSSL.
Notas de uso
Você deve armazenar a
MEKe mantê-la confidencial.A versão do Go deve ser 1.18 ou posterior.
Integração do cliente
1. Obter o driver
alibabacloud-encdb-mysql-go-client é totalmente compatível com o Go MySQL Driver da comunidade e a interface padrão database/sql/driver do Go, permitindo a integração na sua aplicação sem alterações de código.
O driver é de código aberto no GitHub. Para mais informações, consulte alibabacloud-encdb-mysql-go-client.
Para obter o driver, execute o seguinte comando:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
2. Configurar a MEK e conectar
Você pode usar um e comercial (
&) para unir vários parâmetros na URL.O cliente processa a
MEKlocalmente e usa criptografia de envelope para enviá-la com segurança ao servidor, garantindo que aMEKnão seja vazada.
Código de exemplo:
// 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 dados em texto simples
Código de exemplo:
// 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)
}
Exemplo de código completo
O exemplo a seguir usa uma conta de banco de dados com a permissão Ciphertext Permission (JDBC Decryption) para consultar dados em texto simples de colunas criptografadas em um banco de dados PolarDB for MySQL.
A configuração do banco de dados usada neste exemplo está detalhada na seção Exemplo de criptografia de colunas para um banco de dados PolarDB for MySQL do tópico 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 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)
}
}
Após executar o código, a saída descriptografada é semelhante à seguinte:
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