Anda dapat menggunakan driver client confidential alibabacloud-encdb-mysql-go-client untuk menghubungkan aplikasi Go ke confidential database, sehingga memungkinkan pemanfaatan fitur kerahasiaan penuh guna mengenkripsi kolom data dalam tabel database. Topik ini menjelaskan cara menggunakan driver Go tersebut untuk mengakses confidential database.
Driver alibabacloud-encdb-mysql-go-client secara otomatis mendekripsi ciphertext dan mengembalikan data teks biasa selama kunci pengguna yang diperlukan tersedia. Proses ini transparan bagi aplikasi Anda. Cukup dengan mengonfigurasi beberapa baris kode, Anda dapat menghubungkan aplikasi ke confidential database, sehingga mengurangi biaya penggunaan fitur kerahasiaan penuh.
Prasyarat
Pastikan fitur always-confidential telah diaktifkan dan aturan enkripsi telah dikonfigurasi sesuai kebutuhan. Untuk informasi selengkapnya tentang cara mengaktifkan fitur always-confidential, lihat Enable the always-confidential feature.
Anda memiliki informasi koneksi untuk database terenkripsi: nama domain (host), port, nama database (dbname), username, dan password.
Program Go telah dideploy, dan versi Go adalah 1.18 atau lebih baru.
Prosedur
Dapatkan driver Go untuk confidential database
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latestDriver alibabacloud-encdb-mysql-go-client sepenuhnya kompatibel dengan edisi komunitas driver MySQL Go dan mendukung antarmuka standar Go database/sql/driver, sehingga memungkinkan integrasi tanpa perubahan pada kode aplikasi Anda.
Driver ini bersifat open source di GitHub. Untuk informasi selengkapnya, lihat https://github.com/aliyun/alibabacloud-encdb-mysql-go-client.
Kueri data dari client confidential
Anda dapat menggunakan alibabacloud-encdb-mysql-go-client dengan cara yang sama seperti menggunakan driver MySQL Go. Pertama, konfigurasikan parameter Master Key (MEK) dan algoritma enkripsi (ENC_ALGO). PolarDB mendukung penyematan parameter dalam URL, sebagai berikut:
mek := ...
encAlgo := ...
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=<mek>&ENC_ALGO=<encAlgo>")
if err != nil {
panic(err)
}Untuk mengonfigurasi beberapa parameter dalam URL, pisahkan dengan tanda ampersand (
&).MEK diproses di client lokal dan dilindungi oleh Enkripsi amplop sebelum dikirim ke server, sehingga memastikan MEK tidak terekspos.
Tabel berikut menjelaskan parameter MEK dan ENC_ALGO serta memberikan contohnya.
Parameter | Deskripsi | Contoh |
MEK | kunci master pelanggan (CMK). Anda menentukan kunci ini. Metode pembuatan umum: Gunakan tool pembuat password, seperti openssl atau `openssl rand -hex 16`. Anda juga dapat menggunakan Fungsi acak dalam bahasa pemrograman atau memperoleh kunci dari Key Management Service (KMS) pihak ketiga. Rentang nilai: String heksadesimal sepanjang 16 byte, yaitu 32 karakter. Penting kunci master pelanggan merupakan kredensial utama untuk mengakses data terenkripsi. Untuk alasan keamanan, confidential database tidak menyimpan atau mengelola kunci master Anda. Layanan ini juga tidak menyediakan fitur untuk menghasilkan atau backup kunci master Anda. Anda harus membuat kunci master tersebut sendiri. Jika Anda kehilangan kunci tersebut, Anda tidak akan lagi dapat mengakses data yang sudah ada. Oleh karena itu, backup kunci master pelanggan Anda secara aman. | 00112233445566778899aabbccddeeff |
ENC_ALGO | algoritma enkripsi yang digunakan untuk data yang dilindungi. Mendukung dua kategori utama: Standar Enkripsi Lanjutan (AES) dan algoritma kriptografi Tiongkok
Catatan Algoritma enkripsi AES_128_ECB dan SM4_128_ECB kurang aman. Gunakan dengan hati-hati. | SM4_128_CBC |
Contoh
Contoh ini menggunakan proyek demo baru yang dibuat dengan go mod init demo untuk menunjukkan cara menggunakan alibabacloud-encdb-mysql-go-client.
package main
import (
"database/sql"
"fmt"
_ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)
func main() {
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff&ENC_ALGO=SM4_128_CBC")
if err != nil {
panic(err)
}
_, err = db.Exec("DROP TABLE IF EXISTS test")
if err != nil {
panic(err)
}
_, err = db.Exec(`create table test(a int, b text, c float)`)
if err != nil {
panic(err)
}
_, err = db.Exec(`insert into test set a = 0, b = 'test', c = 0.0`)
if err != nil {
panic(err)
}
rows, err := db.Query("SELECT * FROM test")
rows.Next()
var a int
var b string
var c float32
err = rows.Scan(&a, &b, &c)
fmt.Printf("membaca data: %d %s %f\n", a, b, c)
}Ganti informasi koneksi placeholder dalam contoh—seperti nama domain (hostname), port, nama database (dbname), username, dan password—dengan informasi aktual kluster Anda. Setelah menjalankan kode, sistem akan mengembalikan hasil yang telah didekripsi seperti berikut:
membaca data: 0 test 0.000000