Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan penyulitan data web menggunakan Golang

Bagaimana untuk melaksanakan penyulitan data web menggunakan Golang

WBOY
WBOYasal
2023-06-24 12:27:10971semak imbas

Dengan pembangunan aplikasi web, penyulitan data menjadi semakin penting. Apabila pengguna menggunakan aplikasi web, data yang mereka serahkan perlu disulitkan dan dihantar ke pelayan untuk mengelak daripada dipintas dan dicuri oleh pihak yang berniat jahat. Golang ialah bahasa pengaturcaraan popular yang menyediakan keupayaan penyulitan dan penyahsulitan yang kuat. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan penyulitan data Web.

1. Gunakan algoritma penyulitan Golang

  1. Algoritma penyulitan AES

Apabila menggunakan Golang untuk penyulitan data Web, algoritma yang paling biasa digunakan ialah algoritma penyulitan AES. Algoritma AES ialah algoritma penyulitan simetri yang menggunakan kunci yang sama untuk penyulitan dan penyahsulitan. Apabila menyulitkan menggunakan algoritma AES, panjang kunci mestilah 16, 24 atau 32 bait. Berikut ialah kod tentang cara melaksanakan penyulitan AES menggunakan Golang:

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

func AESEncrypt(origData []byte, key []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }
    blockSize := block.BlockSize()
    origData = PKCS5Padding(origData, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
    cipherText := make([]byte, len(origData))
    blockMode.CryptBlocks(cipherText, origData)
    return base64.StdEncoding.EncodeToString(cipherText), nil
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

Dalam kod di atas, kami menggunakan algoritma AES dan fungsi PKCS5Padding. Fungsi PKCS5Padding digunakan untuk pad plaintext untuk memenuhi keperluan saiz blok menggunakan algoritma AES. Kami kemudiannya menggunakan CBCEncrypter untuk menyulitkan teks biasa empuk ke dalam teks sifir. Akhir sekali, teks sifir dikodkan base64 untuk penghantaran.

  1. Algoritma penyulitan RSA

Algoritma penyulitan RSA ialah algoritma penyulitan asimetri yang menggunakan kunci awam untuk menyulitkan data dan kunci peribadi untuk menyahsulit data. Apabila menyulitkan menggunakan algoritma RSA, kunci awam dan kunci peribadi adalah sepasang. Berikut ialah kod tentang cara melaksanakan penyulitan RSA menggunakan Golang:

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/base64"
    "encoding/pem"
    "fmt"
)

func RSAEncrypt(origData []byte, publicKey []byte) (string, error) {
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return "", fmt.Errorf("failed to decode public key")
    }
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return "", err
    }
    pub := pubInterface.(*rsa.PublicKey)
    cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
    if err != nil {
        return "", err
    }
    return base64.StdEncoding.EncodeToString(cipherText), nil
}

Dalam kod di atas, kami menghantar kunci awam sebagai parameter kepada fungsi RSAEncrypt. Dalam fungsi tersebut, kami menggunakan PEM untuk menyahkod kunci awam dan menghuraikannya ke dalam jenis RSA.PublicKey. Kami kemudian menggunakan fungsi EncryptPKCS1v15 untuk menyulitkan plaintext. Akhir sekali, teks sifir dikodkan base64 untuk penghantaran.

2. Gunakan algoritma penyulitan dalam aplikasi web

Apabila anda menggunakan Golang untuk menulis aplikasi web, anda boleh menggunakan pakej net/http Golang untuk melaksanakan penyulitan dan penyahsulitan data. Berikut ialah kod tentang cara menggunakan algoritma AES dan RSA dalam aplikasi web:

  1. Menyulitkan permintaan menggunakan algoritma AES
import (
    "net/http"
)

func handleRequest(w http.ResponseWriter, r *http.Request) {
    key := []byte("1234567890123456") // AES key length must be 16, 24, or 32 bytes
    originalData := []byte("data to encrypt")

    cipherText, err := AESEncrypt(originalData, key)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Write([]byte(cipherText))
}

Dalam kod di atas, kami mentakrifkan kunci AES terlebih dahulu. Kami kemudian menyulitkan data asal dan menulis teks sifir kepada respons.

  1. Sulitkan permintaan menggunakan algoritma RSA
import (
    "net/http"
)

func handleRequest(w http.ResponseWriter, r *http.Request) {
    publicKey := []byte(`
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJl4bGZ/9XIpC6wPqYCC9d/P/wjQM6FG
KmNl02Ax9zEgSU+luOKvaYKlEW6dFlEtJ93IvOnrs5uIVIDBsW0iO8CAwEAAQ==
-----END PUBLIC KEY-----
`)

    originalData := []byte("data to encrypt")

    cipherText, err := RSAEncrypt(originalData, publicKey)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Write([]byte(cipherText))
}

Dalam kod di atas, kami menghantar kunci awam sebagai parameter kepada fungsi RSAEncrypt. Fungsi RSAEncrypt menyulitkan data asal menggunakan kunci awam dan menulis teks sifir kepada respons.

3. Ringkasan

Penyulitan data web adalah penting untuk melindungi data pengguna dan menghalang data daripada dicuri oleh orang tengah yang berniat jahat. Apabila menulis aplikasi web menggunakan Golang, anda boleh menggunakan algoritma AES dan RSA untuk melaksanakan penyulitan data. Sebelum data dihantar, teks biasa disulitkan ke dalam teks sifir dan dinyahsulit pada penerima. Kod sampel di atas menunjukkan cara melaksanakan operasi ini menggunakan Golang.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan penyulitan data web menggunakan Golang. 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