Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan rangka kerja Gin untuk melaksanakan fungsi penyulitan dan penyahsulitan data

Gunakan rangka kerja Gin untuk melaksanakan fungsi penyulitan dan penyahsulitan data

PHPz
PHPzasal
2023-06-23 08:12:091732semak imbas

Dalam bidang Internet moden, keselamatan data sentiasa menjadi topik penting. Apabila menghantar, menyimpan dan memproses data, kita perlu menggunakan pelbagai cara teknikal untuk memastikan keselamatan data Salah satu cara teknikal yang paling penting ialah penyulitan data. Gin ialah rangka kerja web berdasarkan bahasa Go Kesederhanaan, kemudahan penggunaan, kecekapan dan kestabilannya telah digemari oleh banyak pembangun. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Gin untuk melaksanakan fungsi penyulitan dan penyahsulitan data Mari kita belajar tentangnya bersama-sama.

Pertama, kita perlu memahami beberapa pengetahuan asas algoritma penyulitan. Algoritma penyulitan biasanya dibahagikan kepada dua kategori: penyulitan simetri dan penyulitan asimetri. Penyulitan simetri ialah kaedah penyulitan yang menggunakan kunci yang sama untuk menyulitkan dan menyahsulit data. Penyulitan asimetri juga merupakan kaedah penyulitan yang menggunakan pasangan kunci awam dan peribadi untuk menyulitkan dan menyahsulit data. Seterusnya, kami akan mengambil algoritma penyulitan simetri AES sebagai contoh dan menggunakan rangka kerja Gin untuk melaksanakan fungsi penyulitan dan penyahsulitan.

Langkah pertama ialah mengkonfigurasi rangka kerja Gin. Dalam rangka kerja Gin, anda boleh menggunakan modul middleware gin.Recovery() dan gin.Logger() yang disertakan dengan rangka kerja Gin untuk merekodkan log dan pulih daripada ranap pelayan. Kami juga perlu menyambungkan pelayan ke pangkalan data Di sini kami menggunakan perpustakaan GORM untuk menyambung ke pangkalan data (perpustakaan GORM perlu dipasang terlebih dahulu).

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
    router := gin.Default()
    router.Use(gin.Recovery(), gin.Logger())

    db, err := gorm.Open("mysql", "username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    router.Run(":8080")
}

Dalam langkah kedua, kami akan mentakrifkan fungsi perisian tengah untuk menyulitkan data. Di sini, kami akan menggunakan algoritma penyulitan simetri AES yang baru sahaja disebut untuk menyulitkan data menggunakan kunci dan vektor permulaan. Kami boleh menggunakan pakej crypto/aes untuk melaksanakan algoritma penyulitan AES, meletakkan fungsi penyulitan dalam perisian tengah, dan operasi penyulitan akan dilakukan secara automatik pada setiap permintaan.

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "io/ioutil"

    "github.com/gin-gonic/gin"
)

func EncryptMiddleware(key, iv string) gin.HandlerFunc {
    // Convert key and iv to byte arrays.
    keyBytes := []byte(key)
    ivBytes := []byte(iv)

    // Create a new AES cipher block.
    block, err := aes.NewCipher(keyBytes)
    if err != nil {
        panic(err)
    }

    return func(c *gin.Context) {
        // Read the request body.
        data, _ := ioutil.ReadAll(c.Request.Body)

        // Create a new cipher block mode with CBC.
        blockMode := cipher.NewCBCEncrypter(block, ivBytes)

        // Pad the data with PKCS7.
        data = pkcs7Pad(data, block.BlockSize())

        // Encrypt the data.
        blockMode.CryptBlocks(data, data)

        // Set the response to the encrypted data.
        c.Writer.Write([]byte(base64.StdEncoding.EncodeToString(data)))
        c.Next()
    }
}

func pkcs7Pad(data []byte, blockSize int) []byte {
    padding := blockSize - len(data)%blockSize
    padText := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(data, padText...)
}

Dalam langkah ketiga, kami akan mentakrifkan fungsi middleware untuk menyahsulit data. Proses penyahsulitan adalah bertentangan dengan proses penyulitan, dan algoritma AES juga digunakan untuk penyahsulitan. Operasi penyahsulitan juga akan dilakukan secara automatik setiap kali permintaan datang.

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "io/ioutil"

    "github.com/gin-gonic/gin"
)

func DecryptMiddleware(key, iv string) gin.HandlerFunc {
    // Convert key and iv to byte arrays.
    keyBytes := []byte(key)
    ivBytes := []byte(iv)

    // Create a new AES cipher block.
    block, err := aes.NewCipher(keyBytes)
    if err != nil {
        panic(err)
    }

    return func(c *gin.Context) {
        // Read the request body.
        data, _ := ioutil.ReadAll(c.Request.Body)

        // Create a new cipher block mode with CBC.
        blockMode := cipher.NewCBCDecrypter(block, ivBytes)

        // Decode the data from base64.
        data, err = base64.StdEncoding.DecodeString(string(data))
        if err != nil {
            panic(err)
        }

        // Decrypt the data.
        blockMode.CryptBlocks(data, data)

        // Remove any padding.
        data = pkcs7Unpad(data)

        // Set the request body to the decrypted data.
        c.Request.Body = ioutil.NopCloser(bytes.NewReader(data))
        c.Next()
    }
}

func pkcs7Unpad(data []byte) []byte {
    padding := data[len(data)-1]
    return data[:len(data)-int(padding)]
}

Dalam langkah keempat, kami akan menggunakan perisian tengah yang ditentukan untuk menyulitkan dan menyahsulit data. Kami boleh menentukan perisian tengah penyulitan dan penyahsulitan berbilang untuk memproses data bagi laluan yang berbeza. Contohnya, kami akan menggunakan perisian tengah penyulitan untuk menyulitkan data permintaan dan perisian tengah penyahsulitan untuk menyahsulit data tindak balas:

func main() {
    router := gin.Default()
    router.Use(gin.Recovery(), gin.Logger())

    db, err := gorm.Open("mysql", "username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    // Encrypt and Decrypt middlewares.
    key, iv := "0123456789abcdef", "0123456789abcdef"
    router.POST("/encrypt", EncryptMiddleware(key, iv))
    router.POST("/decrypt", DecryptMiddleware(key, iv))

    router.Run(":8080")
}

Kini, kami telah berjaya melaksanakan fungsi penyulitan dan penyahsulitan data menggunakan rangka kerja Gin. Apabila membangunkan aplikasi web, adalah penting untuk memastikan keselamatan data, dan dengan menggunakan rangka kerja Gin dan algoritma penyulitan, perlindungan data sensitif boleh dicapai dengan mudah.

Atas ialah kandungan terperinci Gunakan rangka kerja Gin untuk melaksanakan fungsi penyulitan dan penyahsulitan data. 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