Bagaimana untuk Menyimpan Kunci Peribadi ECDSA dengan Selamat dalam Go?

Linda Hamilton
Lepaskan: 2024-11-09 17:17:02
asal
619 orang telah melayarinya

How to Store ECDSA Private Keys Securely in Go?

Menyimpan Kunci Peribadi ECDSA dalam Go

Apabila bekerja dengan pasangan kunci ECDSA dalam Go, keperluan sering timbul untuk menyimpan kunci persendirian dengan selamat. Panduan ini akan menyelidiki teknik untuk menyimpan kunci peribadi secara berkesan dalam fail pada komputer pengguna.

Pengekodan dan Penyahkodan Kunci Peribadi

Go tidak menyediakan mekanisme langsung untuk mengawal kunci persendirian menggunakan kaedah eliptik.Marshal. Sebaliknya, proses pengekodan berbilang langkah diperlukan:

  1. Algoritma Kriptografi: Gunakan algoritma ECDSA untuk menjana kunci, seperti ecdsa.GenerateKey(elliptic.P384(), rand.Reader).
  2. Pengekodan Standard: Tukar kunci peribadi kepada format x509 menggunakan x509.MarshalECPrivateKey(privateKey).
  3. Format Fail: Kodkan struktur x509 kepada format PEM menggunakan pem.EncodeToMemory(blok), dengan blok mewakili struktur x509.

Kod Contoh

Kod Go berikut menunjukkan proses di atas:

package main

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

func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) {
    x509Encoded, _ := x509.MarshalECPrivateKey(privateKey)
    pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})

    x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey)
    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) {
    block, _ := pem.Decode([]byte(pemEncoded))
    x509Encoded := block.Bytes
    privateKey, _ := x509.ParseECPrivateKey(x509Encoded)

    blockPub, _ := pem.Decode([]byte(pemEncodedPub))
    x509EncodedPub := blockPub.Bytes
    genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub)
    publicKey := genericPublicKey.(*ecdsa.PublicKey)

    return privateKey, publicKey
}

func main() {
    privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
    publicKey := &privateKey.PublicKey

    encPriv, encPub := encode(privateKey, publicKey)

    fmt.Println(encPriv)
    fmt.Println(encPub)

    priv2, pub2 := decode(encPriv, encPub)

    if !reflect.DeepEqual(privateKey, priv2) {
        fmt.Println("Private keys do not match.")
    }
    if !reflect.DeepEqual(publicKey, pub2) {
        fmt.Println("Public keys do not match.")
    }
}
Salin selepas log masuk

Dengan menyimpan kunci peribadi yang dikodkan PEM sebagai fail, ia boleh diambil dan dinyahkod kemudian mengikut keperluan. Ingat untuk menggunakan langkah keselamatan yang sesuai untuk melindungi fail daripada akses atau pendedahan yang tidak dibenarkan.

Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Kunci Peribadi ECDSA dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan