Alibaba Cloud menyediakan alibabacloud-encdb-mysql-go-client, sebuah driver Go khusus yang menyederhanakan enkripsi database sisi klien. Driver ini mengotomatiskan dekripsi ciphertext, memungkinkan aplikasi Go Anda menangani data sensitif seolah-olah itu teks biasa secara transparan dengan perubahan kode minimal. Untuk mengaktifkan fitur ini, cukup gunakan driver untuk terhubung dan tentukan Master Encryption Key (MEK) di URL koneksi. Panduan ini memberikan instruksi langkah demi langkah untuk mengintegrasikan driver, mengonfigurasi koneksi, dan menanyakan data terenkripsi.
Prasyarat
Sebelum memulai, pastikan pengaturan berikut sudah lengkap:
Anda telah menjalankan pemindaian deteksi data sensitif untuk mengidentifikasi kolom yang ingin dienkripsi. Untuk informasi lebih lanjut, lihat Deteksi Data Sensitif.
Anda telah mengaktifkan Enkripsi Kolom untuk database tujuan dan memberikan Ciphertext Permission (JDBC Decryption) untuk akun database tujuan. Untuk informasi lebih lanjut, lihat Enkripsi Kolom.
Informasi koneksi tentang instans RDS yang memiliki fitur Database Selalu Rahasia diaktifkan telah diperoleh. Informasi koneksi mencakup nama domain (host), nomor port (port), nama instans (dbname), nama pengguna (username), dan kata sandi (password).
Kunci Enkripsi Utama (MEK)
MEK adalah kredensial utama yang mengotorisasi aplikasi klien Anda untuk mengakses data terenkripsi. Berikut cara kerjanya:
Klien mentransmisikan kunci ke server database melalui protokol enkripsi kunci asimetris yang aman. Proses ini memungkinkan server dan klien berbagi kunci yang sama sehingga data dapat ditransmisikan secara aman menggunakan enkripsi simetris.
Nilainya harus berupa string heksadesimal 32 karakter, yang mewakili 16 byte data.
MEK adalah kredensial utama yang Anda gunakan untuk mengotorisasi klien agar dapat mengakses data terenkripsi. Untuk memastikan keamanan, fitur Database Selalu Rahasia tidak menghasilkan, menyimpan, atau mencadangkan MEK Anda. Anda harus secara manual menghasilkan MEK dan memastikan bahwa MEK disimpan dengan aman. Untuk memastikan keamanan database yang memiliki fitur Database Selalu Rahasia diaktifkan, Anda harus menyimpan dan mengelola MEK dengan cara yang aman. Kami merekomendasikan agar Anda mencadangkan MEK Anda.
Anda bertanggung jawab untuk menghasilkan dan menyimpan MEK Anda dengan aman. Metode umum adalah menggunakan alat kriptografi seperti OpenSSL.
Contohnya:
Di Linux atau macOS, jalankan perintah ini dengan alat OpenSSL bawaan:
openssl rand -hex 16Ini akan menghasilkan string heksadesimal acak 32 karakter, misalnya:
00112233445566778899aabbccddeeff.Di Windows, instal Paket OpenSSL untuk menggunakan perintah yang sama.
Catatan penggunaan
Anda harus menyimpan
MEKdan menjaga kerahasiaannya.Versi Go harus 1.18 atau lebih baru.
Prosedur
1. Dapatkan driver
alibabacloud-encdb-mysql-go-client sepenuhnya kompatibel dengan Go-MySQL-Driver untuk Edisi Komunitas MySQL dan mendukung operasi database/sql/driver standar Go. Dalam hal ini, koneksi database dapat dibuat tanpa perlu mengubah kode.
Kode sumber terbuka dari driver tersedia di GitHub. Untuk informasi lebih lanjut, lihat alibabacloud-encdb-mysql-go-client.
Jalankan perintah berikut untuk mendapatkan driver:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest2. Konfigurasikan parameter MEK dan hubungkan ke database
Jika Anda mendapatkan driver dengan mengonfigurasi URL, Anda dapat menggunakan ampersand (
&) untuk menggabungkan beberapa parameter.Parameter
MEKdan parameter lainnya dikonfigurasi di sisi klien dan ditransmisikan ke sisi server menggunakan enkripsi amplop. Selama proses ini, kerahasiaan nilai parameterMEKharus dipastikan.
Contoh kode:
// Perbarui informasi koneksi seperti titik akhir (hostname), nomor port (port), nama instans (dbname), nama pengguna (username), dan kata sandi (password) berdasarkan skenario aktual.
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}3. Tanyakan data teks biasa dari kolom terenkripsi
Contoh kode:
// Mulai kueri.
rows, err := db.Query("SELECT * FROM sddp_test_mask")
if err != nil {
log.Fatalf("Gagal menanyakan data: %v", err)
}
// Pastikan set hasil kueri ditutup setelah digunakan.
defer rows.Close()
// Definisikan variabel untuk menyimpan data untuk setiap baris.
var id int
var name string
var password string
var age int
// Lintasi setiap baris.
for rows.Next() {
// Ekstrak data dari baris saat ini dan tetapkan data ke variabel yang ditentukan.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Gagal memindai baris: %v", err)
}
// Tampilkan data dari baris saat ini.
fmt.Printf("membaca data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}Kode contoh lengkap
Sebagai contoh, Anda menggunakan akun database yang memiliki ciphertext permission (JDBC decryption) untuk melihat data teks biasa dari kolom terenkripsi dalam database PolarDB for MySQL.
Untuk informasi lebih lanjut tentang konfigurasi database dalam kode contoh berikut, lihat Enkripsi Kolom dalam Database PolarDB for MySQL di bagian Enkripsi Kolom.
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)
func main() {
// Perbarui informasi koneksi seperti titik akhir (hostname), nomor port (port), nama instans (dbname), nama pengguna (username), dan kata sandi (password) berdasarkan skenario aktual.
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("Gagal menanyakan data: %v", err)
}
// Pastikan set hasil kueri ditutup setelah digunakan.
defer rows.Close()
// Definisikan variabel untuk menyimpan data untuk setiap baris.
var id int
var name string
var password string
var age int
// Lintasi setiap baris.
for rows.Next() {
// Ekstrak data dari baris saat ini dan tetapkan data ke variabel yang ditentukan.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Gagal memindai baris: %v", err)
}
// Tampilkan data dari baris saat ini.
fmt.Printf("membaca data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
}Setelah kode di atas dipanggil, hasil dekripsi serupa dengan informasi berikut dikembalikan.
