Após ativar a criptografia de colunas em um banco de dados ApsaraDB RDS for MySQL ou PolarDB for MySQL, utilize o driver alibabacloud-encdb-mysql-go-client na sua aplicação Go para acessar dados em texto simples a partir de colunas criptografadas.
Informações básicas
A criptografia de colunas aumenta a segurança dos dados ao armazená-los como texto cifrado em colunas específicas. Clientes autorizados acessam esses dados de forma transparente como texto simples.
O Alibaba Cloud fornece o alibabacloud-encdb-mysql-go-client, um driver Go do lado do cliente. Para acessar um banco de dados criptografado, use este driver para se conectar e especifique uma chave mestra de criptografia (MEK) na URL de conexão do banco de dados. O driver descriptografa automaticamente o texto cifrado e retorna os dados em texto simples.
O cliente e o servidor utilizam um protocolo seguro de criptografia assimétrica para transmitir a MEK. Esse processo estabelece uma chave compartilhada entre eles para a criptografia simétrica segura dos dados.
Intervalo de valores: Uma string hexadecimal de 16 bytes, com exatamente 32 caracteres.
A MEK é a credencial raiz que autoriza seu cliente a acessar dados criptografados. Por motivos de segurança, o banco de dados criptografado não armazena nem gerencia sua MEK, tampouco oferece serviços de geração ou backup da MEK. Você é responsável por gerar sua própria MEK. Proteger a MEK é fundamental para a segurança do seu banco de dados. Recomendamos que você faça backup da sua MEK em um local seguro.
Prerequisites
-
Enable column encryption for the target database and set the ciphertext permission for the target database account to Ciphertext Permission (JDBC Decryption). For detailed instructions on configuring database column encryption and account permissions, see Configure database column encryption.
-
Obtain the encrypted database connection information: endpoint, port, database name, database account, and password.
Observações de uso
Armazene sua chave mestra de criptografia (
MEK) com segurança.É necessário ter a versão 1,18 ou posterior do Go.
Integração do cliente
1. Obter o driver
O alibabacloud-encdb-mysql-go-client é totalmente compatível com o Go MySQL Driver da comunidade e com a interface padrão do Go database/sql/driver, permitindo a integração à sua aplicação sem alterações no código.
Este driver é open source 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. Configure a MEK e conectar
Use um "e" comercial (
&) para unir vários parâmetros na URL.O cliente processa a
MEKlocalmente e utiliza criptografia de envelope para enviá-la com segurança ao servidor, garantindo que aMEKnão seja exposta.
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. Selecione 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 utiliza uma conta de banco de dados com a Ciphertext Permission (JDBC Decryption) para consultar dados em texto simples a partir 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 será 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