Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menyimpan dan mendapatkan semula kunci peribadi ECDSA dalam Go dengan selamat?

Bagaimanakah saya boleh menyimpan dan mendapatkan semula kunci peribadi ECDSA dalam Go dengan selamat?

DDD
DDDasal
2024-11-09 06:39:03642semak imbas

How can I securely store and retrieve ECDSA private keys in Go?

Menyimpan Kunci Peribadi ECDSA dalam Go

Apabila bekerja dengan pasangan kunci ECDSA dalam Go, keperluan untuk menyimpan kunci persendirian dengan selamat. Walaupun kaedah eliptik.Marshal menyediakan pengekodan untuk kunci awam, tiada yang setara untuk kunci persendirian. Artikel ini meneroka cara menyimpan dan memuatkan kunci persendirian dalam Go.

Pengekodan dan Penyahkodan

Untuk menyimpan kunci persendirian, perlu menggunakan pendekatan berbilang langkah yang melibatkan Penyulitan kunci ECDSA, pengekodan standard dan format fail. Gabungan biasa melibatkan penggunaan algoritma ECDSA untuk penjanaan kunci, X.509 untuk pengekodan dan format PEM (Privacy-Enhanced Mail) untuk storan.

Contoh Kod

Coretan kod berikut menunjukkan cara mengekod dan menyahkod kekunci ECDSA Pergi:

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 test() {
    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.")
    }
}

Dalam fungsi ujian:

  1. Pasangan kunci peribadi/awam ECDSA baharu dijana.
  2. Kunci peribadi dan awam dikodkan dan rentetan yang dikodkan dicetak.
  3. Rentetan yang dikodkan dinyahkod untuk memulihkan yang asal kunci.
  4. Kunci yang dipulihkan dibandingkan dengan yang asal untuk mengesahkan sama ada ia sepadan.

Dengan menggunakan teknik yang digariskan di atas, anda boleh menyimpan dan mendapatkan kunci persendirian ECDSA dengan selamat dalam Go , membolehkan penciptaan dan pengurusan tandatangan digital dalam aplikasi anda.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyimpan dan mendapatkan semula 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