alibabacloud-encdb-mysql-go-client , istemci tarafında sütun şifrelemesi sağlayan bir Go sürücüsüdür. Sorgu sonuçlarını yakalar ve şifreli metni otomatik olarak çözer; böylece uygulamanız SQL sorgularınızı değiştirmeden hassas sütunları düz metin olarak okuyabilir. Şifre çözme işlemini etkinleştirmek için bağlantı URL'sinde ana şifreleme anahtarınızı (MEK) belirtin.
Önkoşullar
Şifreleme gerektiren sütunları bulmak için bir hassas veri algılama taraması çalıştırdınız.
Hedef veritabanı için sütun şifrelemeyi yapılandırdınız ve veritabanı hesabının iznini Ciphertext Permission (JDBC Decryption) olarak ayarladınız. Ayrıntılı talimatlar için bkz. sütun şifreleme.
Örnek için bağlantı ayrıntıları: ana bilgisayar adı, bağlantı noktası, veritabanı adı, kullanıcı adı ve parola.
MEK'yi yapılandırma
Anahtar, sunucu ve istemcinin aynı anahtarı paylaşmasını sağlayan güvenli bir asimetrik şifreleme protokolü aracılığıyla istemciden veritabanı sunucusuna iletilir; bu sayede veriler simetrik şifreleme yoluyla güvenli bir şekilde aktarılır.
Değer aralığı: Tam olarak 32 karakter uzunluğunda, 16 baytlık onaltılık bir dize.
Önemli uyarı: MEK'nizi kaybederseniz, bu ilke altında şifrelenen tüm geçmiş sorgu sonuçları kalıcı olarak çözülemez hale gelir.
MEK oluşturmak için anahtar oluşturma araçlarını veya çeşitli programlama dillerindeki rastgele işlevleri kullanabilirsiniz. Örneğin:
Linux:
openssl rand -hex 16komutunu çalıştırın.Windows: OpenSSL tool yükleyin ve kullanın.
Kullanım notları
MEKdeğerini saklamalı ve gizli tutmalısınız.Go sürümü 1,18 veya üzeri olmalıdır.
İstemci entegrasyonu
1. Sürücüyü edinin
alibabacloud-encdb-mysql-go-client , topluluk tarafından geliştirilen Go MySQL Driver ve standart Go database/sql/driver arabirimiyle tam uyumludur; bu sayede kod değişikliği yapmadan uygulamanıza entegre edilebilir.
Sürücü GitHub'da açık kaynaklıdır. Daha fazla bilgi için bkz. alibabacloud-encdb-mysql-go-client.
Sürücüyü edinmek için aşağıdaki komutu çalıştırın:
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
2. MEK'yi yapılandırın ve bağlanın
URL'de birden çok parametreyi birleştirmek için ampersan (
&) kullanabilirsiniz.İstemci,
MEKdeğerini yerel olarak işler ve zarf şifreleme kullanarak sunucuya güvenli bir şekilde gönderir; bu sayedeMEKsızdırılmaz.
Örnek kod:
// 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. Düz metin verilerini sorgulayın
Örnek kod:
// 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)
}
Tam kod örneği
Aşağıdaki örnekte, PolarDB for MySQL veritabanındaki şifrelenmiş sütunlardan düz metin verilerini sorgulamak için Ciphertext Permission (JDBC Decryption) iznine sahip bir veritabanı hesabı kullanılmaktadır.
Bu örnekte kullanılan veritabanı yapılandırması, Sütun şifreleme konusunun PolarDB for MySQL veritabanı için sütun şifreleme örneği bölümünde ayrıntılı olarak açıklanmıştır.
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)
}
}
Kodu çalıştırdıktan sonra, şifresi çözülmüş çıktı aşağıdakine benzer:
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