Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyulitkan medan data dalam pangkalan data MySQL menggunakan bahasa Go

Bagaimana untuk menyulitkan medan data dalam pangkalan data MySQL menggunakan bahasa Go

王林
王林asal
2023-06-17 18:34:331770semak imbas

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.

  1. Import pakej pergantungan

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"
)
  1. Sambungan pangkalan data

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{})
  1. Rekodkan kekunci penyulitan dan penyahsulitan

. 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!")
  1. Tentukan fungsi penyulitan dan penyahsulitan

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
}
  1. Contoh: Tambahkan medan yang disulitkan dalam pangkalan data MySQL

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.

  1. Contoh: Medan yang disulitkan pertanyaan 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn