>  기사  >  백엔드 개발  >  Go에서 ECDSA 개인 키를 안전하게 저장하는 방법은 무엇입니까?

Go에서 ECDSA 개인 키를 안전하게 저장하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-09 17:17:02601검색

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으로 인코딩된 개인 키를 파일로 저장하면 나중에 필요에 따라 검색하고 디코딩할 수 있습니다. 무단 액세스 또는 노출로부터 파일을 보호하기 위해 적절한 보안 조치를 취하는 것을 잊지 마십시오.

위 내용은 Go에서 ECDSA 개인 키를 안전하게 저장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.