「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で ECDSA 秘密キーを安全に保存および取得するにはどうすればよいですか?

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

2024 年 11 月 22 日に公開
ブラウズ:565

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

Go での ECDSA 秘密キーの保存

Go で ECDSA キー ペアを操作する場合、秘密キーを安全に保存する必要があります。 elliptic.Marshal メソッドは公開キーのエンコーディングを提供しますが、秘密キーに相当するものはありません。この記事では、Go で秘密キーを保存およびロードする方法について説明します。

エンコードとデコード

秘密キーを保存するには、次のような複数段階のアプローチを採用する必要があります。 ECDSA キー暗号化、標準エンコーディング、およびファイル形式。一般的な組み合わせには、キー生成に ECDSA アルゴリズム、エンコードに X.509、ストレージに PEM (プライバシー強化メール) 形式を使用することが含まれます。

コード例

]次のコード スニペットは、Go で ECDSA キーをエンコードおよびデコードする方法を示しています。

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. 復元されたキーは、

上記で概説した手法を利用すると、Go で ECDSA 秘密キーを安全に保存および取得でき、アプリケーション内でデジタル署名の作成と管理が可能になります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3