«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу безопасно хранить и получать закрытые ключи ECDSA в Go?

Как я могу безопасно хранить и получать закрытые ключи ECDSA в Go?

Опубликовано 22 ноября 2024 г.
Просматривать:163

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

Хранение закрытого ключа ECDSA в Go

При работе с парами ключей ECDSA в Go возникает необходимость надежно хранить закрытый ключ. Хотя метод elliptic.Marshal обеспечивает кодировку открытого ключа, для закрытого ключа не существует эквивалента. В этой статье рассказывается, как сохранять и загружать закрытые ключи в Go.

Кодирование и декодирование

Для хранения закрытого ключа необходимо применить многоэтапный подход, включающий Шифрование ключей ECDSA, стандартная кодировка и формат файла. Общая комбинация включает использование алгоритма ECDSA для генерации ключей, X.509 для кодирования и формата PEM (Privacy-Enhanced Mail) для хранения.

Пример кода

Следующий фрагмент кода демонстрирует, как кодировать и декодировать ключи ECDSA в Go:

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

В тестовой функции:

  1. Генерируется новая пара частного/открытого ключа ECDSA.
  2. Частный и открытый ключи закодированы, а закодированные строки напечатано.
  3. Закодированные строки декодируются для восстановления исходных ключей.
  4. Восстановленные ключи сравниваются с оригинальные, чтобы проверить, совпадают ли они.

Используя методы, описанные выше, вы можете безопасно хранить и извлекать закрытые ключи ECDSA в Go, что позволяет создавать цифровые подписи и управлять ими в ваших приложениях.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3