Memandangkan isu keselamatan pangkalan data menjadi semakin ketara, penyulitan data telah menjadi langkah yang perlu. Kecekapan dan kesederhanaan bahasa Go telah menarik banyak perhatian, terutamanya dalam bidang pembangunan web. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan pemprosesan penyulitan medan data dalam pangkalan data MySQL.
1. Kepentingan penyulitan medan pangkalan data MySQL
Dalam konteks era maklumat moden, sistem pangkalan data telah menjadi semakin penting. Walau bagaimanapun, disebabkan peningkatan ancaman, keselamatan pangkalan data telah menjadi cabaran utama bagi perniagaan dan organisasi. Beberapa kajian menunjukkan bahawa serangan pangkalan data dan pelanggaran data telah menjadi salah satu risiko keselamatan terbesar kepada perniagaan. Oleh itu, penyulitan data telah menjadi salah satu cara yang diperlukan untuk menyelesaikan masalah ini.
Kepentingan penyulitan medan pangkalan data adalah untuk melindungi maklumat sensitif dalam pangkalan data, seperti nama pengguna, nombor telefon, alamat e-mel, kata laluan, dll., untuk mengelakkan serangan penggodam dan kebocoran data. Dengan menyulitkan data sensitif ini, penggodam boleh menahan pelayaran data dan kecurian maklumat apabila data diperoleh.
2. Cara melaksanakan penyulitan medan data pangkalan data MySQL menggunakan bahasa Go
Bahasa Go ialah bahasa pengaturcaraan sumber terbuka yang cekap, ringan, disusun dan digunakan secara meluas dalam pembangunan web. Kami boleh menggunakan perpustakaan dalam bahasa Go untuk menyulitkan dan menyahsulit medan data dalam pangkalan data MySQL. Di sini kami menggunakan perpustakaan GORM bahasa Go.
GORM ialah perpustakaan ORM bahasa Go yang sangat baik Ia menyediakan akses pangkalan data yang mengutamakan kod dan menyokong pelbagai pangkalan data, termasuk MySQL, SQLite, PostgreSQL, SQL Server, dll. Kami boleh melaksanakan penyulitan pangkalan data MySQL dengan mudah dengan menggunakan perpustakaan GORM.
Buka persekitaran pembangunan bahasa Go dan import pakej pergantungan yang perlu anda gunakan:
import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" )
Gunakan fungsi Buka GORM untuk menyambung ke pangkalan data adalah seperti berikut:
dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
. Dalam contoh ini, kami penyulitan AES dan mekanisme penyahsulitan akan digunakan. Kami perlu merekodkan kunci penyulitan dan penyahsulitan dalam kod untuk kegunaan kemudian Kod tersebut adalah seperti berikut:
var key = []byte("the-key-has-to-be-32-bytes-long!")
Kita perlu mentakrifkan. fungsi penyulitan dan penyahsulitan, penyulitan AES dan mod penyulitan CBC digunakan di sini. Kod fungsi penyulitan adalah seperti berikut:
func encrypt(data []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } plaintext := padData(data) // The IV needs to be unique, but not secure. Therefore it's common to // include it at the beginning of the ciphertext. ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := rand.Read(iv); err != nil { return nil, err } mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) return []byte(base64.StdEncoding.EncodeToString(ciphertext)), nil }
Kod fungsi penyahsulitan adalah seperti berikut:
func decrypt(data []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } ciphertext, err := base64.StdEncoding.DecodeString(string(data)) if err != nil { return nil, err } if len(ciphertext) < aes.BlockSize { return nil, fmt.Errorf("ciphertext too short") } iv := ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:] // CBC mode always works in whole blocks. if len(ciphertext)%aes.BlockSize != 0 { return nil, fmt.Errorf("ciphertext is not a multiple of the block size") } mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext) return unpadData(ciphertext), nil }
Mari kita lihat satu contoh Lengkap. Katakan kita ingin menambah medan yang disulitkan pada jadual dalam pangkalan data MySQL. Tulis kod model seperti berikut:
type User struct { ID uint Name string Email string Passwd []byte `gorm:"column:passwd"` }
Seterusnya, tulis semula kaedah penulisan dan bacaan nama jadual dan medan yang disulitkan dalam model, kodnya adalah seperti berikut:
func (u *User) TableName() string { return "users" } func (u *User) BeforeSave(tx *gorm.DB) (err error) { pData, err := encrypt(u.Passwd) if err != nil { return } u.Passwd = pData return } func (u *User) AfterFind(tx *gorm.DB) (err error) { pData, err := decrypt(u.Passwd) if err != nil { return } u.Passwd = pData return }
Dalam BeforeSave( ) kaedah, tambah Kata laluan pengguna disulitkan dan disimpan. Dalam kaedah AfterFind(), nyahsulit kata laluan yang disulitkan yang disimpan dan kembalikannya. Dengan cara ini kita boleh menyimpan medan kata laluan yang disulitkan dalam pangkalan data MySQL.
Apabila kami menggunakan medan yang disulitkan dalam jadual, data mesti dinyahsulit semasa pertanyaan. Kami boleh menyahsulit medan yang disulitkan secara automatik dalam hasil pertanyaan dengan menggunakan cangkuk AfterFind. Berikut ialah kod sampel:
users := []User{} result := db.Find(&users) if result.Error != nil { panic(result.Error) } for _, user := range users { fmt.Println(user) }
Dalam contoh di atas, kami menanyakan semua rekod pengguna dan mencetak hasil yang dikembalikan ke konsol. Apabila memanggil fungsi Find(), GORM akan secara automatik melaksanakan kaedah AfterFind() untuk menyahsulit hasilnya.
3. Ringkasan
Dalam artikel ini, kami memperkenalkan kaedah menggunakan bahasa Go dan perpustakaan GORM untuk melaksanakan penyulitan medan dalam pangkalan data MySQL fungsi penyahsulitan, dan operasi Penyahsulitan apabila menulis medan yang disulitkan pada jadual dan data pertanyaan. Dengan operasi ini, kami boleh menyulitkan dan melindungi maklumat sensitif dengan mudah dalam pangkalan data MySQL.
Atas ialah kandungan terperinci Bagaimana untuk menyulitkan medan data dalam pangkalan data MySQL menggunakan bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!