ホームページ > バックエンド開発 > Golang > ECDSA 秘密キーを Go に安全に保存するにはどうすればよいですか?

ECDSA 秘密キーを Go に安全に保存するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-09 17:17:02
オリジナル
673 人が閲覧しました

How to Store ECDSA Private Keys Securely in Go?

Go での ECDSA 秘密キーの保存

Go で ECDSA キー ペアを操作する場合、秘密キーを安全に保存する必要がよくあります。このガイドでは、ユーザーのコンピュータ上のファイルに秘密キーを効果的に保存するためのテクニックについて詳しく説明します。

秘密キーのエンコードとデコード

Go は、マーシャリングのための直接メカニズムを提供しません。 elliptic.Marshal メソッドを使用した秘密鍵。代わりに、複数ステップのエンコード プロセスが必要です。

  1. 暗号アルゴリズム: ECDSA アルゴリズムを使用してキーを生成します (例: ecdsa.GenerateKey(elliptic.P384(), rand.Reader).
  2. 標準エンコード: x509.MarshalECPrivateKey(privateKey) を使用して秘密キーを x509 形式に変換します。
  3. ファイル形式: pem.EncodeToMemory(block) を使用して x509 構造を PEM 形式にエンコードします。ここで、ブロックは x509 を表します

サンプル コード

次の Go コードは、上記のプロセスを示しています。

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.")
    }
}
ログイン後にコピー

PEM エンコードされたプライベート ファイルを保存することにより、キーをファイルとして保存すると、後で必要に応じて取得してデコードできます。ファイルを不正なアクセスや公開から保護するために、適切なセキュリティ対策を必ず講じてください。

以上がECDSA 秘密キーを Go に安全に保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート