Setelah mengaktifkan enkripsi kolom pada database ApsaraDB RDS for MySQL atau PolarDB for MySQL, gunakan driver alibabacloud-encdb-mysql-go-client dalam aplikasi Go Anda untuk mengakses data teks biasa dari kolom terenkripsi.
Informasi latar belakang
Enkripsi kolom meningkatkan keamanan data dengan menyimpan data sebagai ciphertext di kolom tertentu. Klien yang memiliki izin dapat mengakses data tersebut secara transparan dalam bentuk teks biasa.
Alibaba Cloud menyediakan alibabacloud-encdb-mysql-go-client, yaitu driver Go sisi klien. Untuk mengakses database terenkripsi, gunakan driver ini saat membuat koneksi dan tentukan kunci enkripsi utama (MEK) dalam URL koneksi database. Driver ini secara otomatis mendekripsi ciphertext dan mengembalikan data teks biasa.
Klien dan server menggunakan protokol enkripsi asimetris yang aman untuk mentransmisikan MEK. Proses ini menetapkan kunci bersama antara keduanya guna mendukung enkripsi data simetris yang aman.
Rentang nilai: String heksadesimal sepanjang 16 byte, tepat 32 karakter.
MEK adalah kredensial akar yang memberi otorisasi kepada klien Anda untuk mengakses data terenkripsi. Untuk alasan keamanan, database terenkripsi tidak menyimpan atau mengelola MEK Anda, juga tidak menyediakan layanan pembuatan atau pencadangan MEK. Anda bertanggung jawab untuk menghasilkan MEK sendiri. Menjaga keamanan MEK sangat penting bagi keamanan database Anda. Kami merekomendasikan agar Anda mencadangkan MEK di lokasi yang aman.
Prasyarat
-
Aktifkan enkripsi kolom untuk database target dan atur izin ciphertext akun database target menjadi Ciphertext Permission (JDBC Decryption). Untuk petunjuk lengkap tentang konfigurasi enkripsi kolom database dan izin akun, lihat Konfigurasikan enkripsi kolom database.
-
Dapatkan informasi koneksi database terenkripsi: endpoint, port, nama database, akun database, dan kata sandi.
Catatan penggunaan
-
Simpan kunci enkripsi utama (
MEK) Anda secara aman. -
Diperlukan Go versi 1.18 atau lebih baru.
Integrasi klien
1. Dapatkan driver
alibabacloud-encdb-mysql-go-client sepenuhnya kompatibel dengan Go MySQL Driver komunitas dan antarmuka standar Go database/sql/driver, sehingga memungkinkan integrasi ke dalam aplikasi Anda tanpa perubahan kode.
Driver ini bersifat open source di GitHub. Untuk informasi lebih lanjut, lihat alibabacloud-encdb-mysql-go-client .
Untuk mendapatkan driver, jalankan perintah berikut:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
2. Konfigurasikan MEK dan hubungkan
-
Anda dapat menggunakan tanda ampersand (
&) untuk menggabungkan beberapa parameter dalam URL. -
Klien memproses
MEKsecara lokal dan menggunakan enkripsi amplop untuk mengirimkannya secara aman ke server, sehingga memastikanMEKtidak bocor.
Kode contoh:
// Ganti placeholder dengan endpoint (hostname), nomor port (port), nama database (dbname), username, dan password aktual Anda.
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}
3. Kueri data teks biasa
Kode contoh:
// Kirim kueri.
rows, err := db.Query("SELECT * FROM sddp_test_mask")
if err != nil {
log.Fatalf("Gagal mengkueri data: %v", err)
}
// Pastikan untuk menutup set hasil setelah digunakan.
defer rows.Close()
// Definisikan variabel untuk menyimpan data setiap baris.
var id int
var name string
var password string
var age int
// Iterasi setiap baris data.
for rows.Next() {
// Pindai data baris saat ini ke dalam variabel.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Gagal memindai baris: %v", err)
}
// Cetak data baris saat ini.
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
Contoh kode lengkap
Contoh berikut menggunakan akun database dengan izin Ciphertext Permission (JDBC Decryption) untuk mengkueri data teks biasa dari kolom terenkripsi dalam database PolarDB for MySQL.
Konfigurasi database yang digunakan dalam contoh ini dijelaskan secara rinci dalam bagian Contoh enkripsi kolom untuk database PolarDB for MySQL pada topik Enkripsi kolom.
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)
func main() {
// Ganti placeholder dengan endpoint (hostname), nomor port (port), nama database (dbname), username, dan password aktual Anda.
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 mengkueri data: %v", err)
}
// Pastikan untuk menutup set hasil setelah digunakan.
defer rows.Close()
// Definisikan variabel untuk menyimpan data setiap baris.
var id int
var name string
var password string
var age int
// Iterasi setiap baris data.
for rows.Next() {
// Pindai data baris saat ini ke dalam variabel.
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("Gagal memindai baris: %v", err)
}
// Cetak data baris saat ini.
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
}
Setelah menjalankan kode, output yang didekripsi mirip dengan berikut:
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