Speichern privater ECDSA-Schlüssel in Go: Eine umfassende Anleitung
Bei der Arbeit mit ECDSA (Elliptic Curve Digital Signature Algorithm) in Go wird es notwendig, um den privaten Schlüssel sicher aufzubewahren. Die ecdsa.GenerateKey-Methode bietet eine Möglichkeit zum Erstellen eines privaten/öffentlichen Schlüsselpaars, überlässt die Speicherung des privaten Schlüssels jedoch dem Entwickler. Dieser Leitfaden befasst sich mit dem empfohlenen Ansatz zum Speichern privater ECDSA-Schlüssel in Go.
Benutzerdefiniertes Marshalling vs. Standardkodierung
Es stellt sich die Frage, ob das Schlüssel-Marshalling manuell implementiert werden soll oder Verwenden Sie eine Standardcodierungsmethode. Der empfohlene Ansatz besteht darin, die Standard-Go-Bibliotheken für die Schlüsselspeicherung zu nutzen. Dies stellt die Interoperabilität mit anderen Anwendungen sicher und entspricht den Best Practices der Branche.
PEM-Kodierung: Eine vielseitige Option
PEM-Kodierung (Privacy-Enhanced Mail) ist eine weit verbreitete Methode Standard zur Aufbewahrung von Schlüsseln. Es umfasst mehrere Schritte:
Schlüssel kodieren und dekodieren
Das folgende Codebeispiel zeigt, wie ECDSA-Schlüssel mithilfe der PEM-Kodierung kodiert und dekodiert werden:
import ( "crypto/ecdsa" "crypto/elliptic" "crypto/pem" "crypto/rand" "fmt" "reflect" ) func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) { // Marshal the private key to X.509 format x509Encoded, _ := x509.MarshalECPrivateKey(privateKey) // Encode the X.509-formatted key into PEM format pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded}) // Marshal the public key to X.509 format x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey) // Encode the X.509-formatted public key into PEM format 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) { // Decode the PEM-encoded private key from a string block, _ := pem.Decode([]byte(pemEncoded)) // Extract the X.509-formatted private key from the PEM block x509Encoded := block.Bytes // Parse the X.509-formatted private key privateKey, _ := x509.ParseECPrivateKey(x509Encoded) // Decode the PEM-encoded public key from a string blockPub, _ := pem.Decode([]byte(pemEncodedPub)) // Extract the X.509-formatted public key from the PEM block x509EncodedPub := blockPub.Bytes // Parse the X.509-formatted public key genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub) // Convert the generic public key to an ecdsa.PublicKey publicKey := genericPublicKey.(*ecdsa.PublicKey) return privateKey, publicKey } // Test the encoding and decoding functionality func test() { // Generate an ECDSA key pair privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) publicKey := &privateKey.PublicKey // Encode the key pair into PEM encPriv, encPub := encode(privateKey, publicKey) // Decode the PEM-encoded key pair priv2, pub2 := decode(encPriv, encPub) // Compare the original and decoded keys if !reflect.DeepEqual(privateKey, priv2) { fmt.Println("Private keys do not match.") } if !reflect.DeepEqual(publicKey, pub2) { fmt.Println("Public keys do not match.") } }
Durch die Nutzung dieser Techniken können Entwickler kann private ECDSA-Schlüssel in Go sicher speichern und verwalten. Die PEM-Kodierung bietet ein robustes und weithin akzeptiertes Format zum Speichern von Schlüsseln, das die Interoperabilität mit verschiedenen Anwendungen ermöglicht und die Datenintegrität gewährleistet.
Das obige ist der detaillierte Inhalt vonWie speichert man private ECDSA-Schlüssel sicher in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!