Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah anda menyimpan kunci peribadi ECDSA dalam Go dengan selamat?

Bagaimanakah anda menyimpan kunci peribadi ECDSA dalam Go dengan selamat?

Barbara Streisand
Barbara Streisandasal
2024-11-11 05:08:02910semak imbas

How do you securely store ECDSA private keys in Go?

Menyimpan Kunci Peribadi ECDSA dalam Go: Panduan Komprehensif

Apabila bekerja dengan ECDSA (Elliptic Curve Digital Signature Algorithm) dalam Go, ia menjadi diperlukan untuk menyimpan kunci persendirian dengan selamat. Kaedah ecdsa.GenerateKey menyediakan cara untuk mencipta pasangan kunci persendirian/awam, tetapi menyerahkan penyimpanan kunci persendirian kepada pembangun. Panduan ini akan menyelidiki pendekatan yang disyorkan untuk menyimpan kunci persendirian ECDSA dalam Go.

Pengekodan Tersuai lwn. Pengekodan Standard

Persoalannya timbul sama ada untuk melaksanakan pengekodan kunci secara manual atau menggunakan kaedah pengekodan standard. Pendekatan yang disyorkan ialah memanfaatkan perpustakaan Go standard untuk storan kunci. Ini memastikan kesalingoperasian dengan aplikasi lain dan mematuhi amalan terbaik industri.

Pengekodan PEM: Pilihan Serbaguna

Pengekodan PEM (Mel Dipertingkatkan Privasi) berfungsi sebagai diterima pakai secara meluas standard untuk menyimpan kunci. Ia menggabungkan beberapa langkah:

  1. Algoritma Kriptografi: Algoritma ECDSA digunakan untuk penjanaan kunci.
  2. Pengekodan X.509: The kunci peribadi dikodkan dalam format X.509, yang biasa digunakan untuk sijil.
  3. Format PEM: Hasilnya dibalut dengan blok PEM untuk memudahkan pengendalian.

Kekunci Pengekodan dan Penyahkod

Sampel kod berikut menunjukkan cara mengekod dan menyahkod kunci ECDSA menggunakan pengekodan PEM:

import (
    "crypto/ecdsa"
    "crypto/elliptic"
    "crypto/pem"
    "crypto/rand"
    "fmt"
    "reflect"
)

func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) {
    // Marshal the private key to X.509 format
    x509Encoded, _ := x509.MarshalECPrivateKey(privateKey)

    // Encode the X.509-formatted key into PEM format
    pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})

    // Marshal the public key to X.509 format
    x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey)

    // Encode the X.509-formatted public key into PEM format
    pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: x509EncodedPub})

    return string(pemEncoded), string(pemEncodedPub)
}

func decode(pemEncoded string, pemEncodedPub string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
    // Decode the PEM-encoded private key from a string
    block, _ := pem.Decode([]byte(pemEncoded))

    // Extract the X.509-formatted private key from the PEM block
    x509Encoded := block.Bytes

    // Parse the X.509-formatted private key
    privateKey, _ := x509.ParseECPrivateKey(x509Encoded)

    // Decode the PEM-encoded public key from a string
    blockPub, _ := pem.Decode([]byte(pemEncodedPub))

    // Extract the X.509-formatted public key from the PEM block
    x509EncodedPub := blockPub.Bytes

    // Parse the X.509-formatted public key
    genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub)

    // Convert the generic public key to an ecdsa.PublicKey
    publicKey := genericPublicKey.(*ecdsa.PublicKey)

    return privateKey, publicKey
}

// Test the encoding and decoding functionality
func test() {
    // Generate an ECDSA key pair
    privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
    publicKey := &privateKey.PublicKey

    // Encode the key pair into PEM
    encPriv, encPub := encode(privateKey, publicKey)

    // Decode the PEM-encoded key pair
    priv2, pub2 := decode(encPriv, encPub)

    // Compare the original and decoded keys
    if !reflect.DeepEqual(privateKey, priv2) {
        fmt.Println("Private keys do not match.")
    }
    if !reflect.DeepEqual(publicKey, pub2) {
        fmt.Println("Public keys do not match.")
    }
}

Dengan memanfaatkan teknik ini, pembangun boleh menyimpan dan mengurus kunci peribadi ECDSA dalam Go dengan selamat. Pengekodan PEM menyediakan format yang mantap dan diterima secara meluas untuk menyimpan kunci, membolehkan kesalingoperasian dengan pelbagai aplikasi dan memastikan integriti data.

Atas ialah kandungan terperinci Bagaimanakah anda menyimpan kunci peribadi ECDSA dalam Go dengan selamat?. 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