"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني تخزين واسترداد مفاتيح ECDSA الخاصة بشكل آمن في Go؟

كيف يمكنني تخزين واسترداد مفاتيح ECDSA الخاصة بشكل آمن في Go؟

تم النشر بتاريخ 2024-11-22
تصفح:938

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

تخزين المفتاح الخاص لـ ECDSA في Go

عند العمل مع أزواج مفاتيح ECDSA في Go، تنشأ الحاجة إلى تخزين المفتاح الخاص بشكل آمن. في حين أن الأسلوب elliptic.Marshal يوفر تشفيرًا للمفتاح العام، إلا أنه لا يوجد ما يعادله للمفتاح الخاص. تستكشف هذه المقالة كيفية حفظ المفاتيح الخاصة وتحميلها في Go.

التشفير وفك التشفير

لتخزين المفتاح الخاص، من الضروري اعتماد نهج متعدد الخطوات يتضمن تشفير مفتاح ECDSA، والتشفير القياسي، وتنسيق الملف. تتضمن المجموعة الشائعة استخدام خوارزمية ECDSA لإنشاء المفاتيح، وX.509 للتشفير، وتنسيق PEM (البريد المعزز للخصوصية) للتخزين. ]يوضح مقتطف الكود التالي كيفية تشفير وفك تشفير مفاتيح ECDSA في Go:

import ( "التشفير/ECDSA" "التشفير/الإهليلجي" "التشفير/الراند" "التشفير/x509" "الترميز / بيم" "إف إم تي" "يعكس" ) func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) { x509Encoded، _ := x509.MarshalECPrivateKey(privateKey) pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY"، البايتات: x509Encoded}) x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey) pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY"، البايتات: x509EncodedPub}) سلسلة الإرجاع (pemEncoded)، سلسلة (pemEncodedPub) } فك تشفير func (سلسلة pemEncoded، سلسلة pemEncodedPub) (*ecdsa.PrivateKey, *ecdsa.PublicKey) { كتلة، _ := pem.Decode([]byte(pemEncoded)) x509Encoded := block.Bytes مفتاح خاص، _ := x509.ParseECPrivateKey(x509Encoded) blockPub, _ := pem.Decode([]byte(pemEncodedPub)) x509EncodedPub := blockPub.Bytes genericPublicKey، _ := x509.ParsePKIXPublicKey(x509EncodedPub) publicKey := genericPublicKey.(*ecdsa.PublicKey) إرجاع المفتاح الخاص، المفتاح العام } اختبار الوظيفة () { مفتاح خاص، _ := ecdsa.GenerateKey(elliptic.P384()، rand.Reader) publicKey := &privateKey.PublicKey encPriv، encPub:= تشفير (privateKey، publicKey) fmt.Println(encPriv) fmt.Println(encPub) priv2، pub2: = فك التشفير (encPriv، encPub) إذا !reflect.DeepEqual(privateKey, priv2) { fmt.Println("المفاتيح الخاصة غير متطابقة.") } إذا !reflect.DeepEqual(publicKey, pub2) { fmt.Println("المفاتيح العامة غير متطابقة.") }

في وظيفة الاختبار:

يتم إنشاء زوج مفاتيح خاص/عام جديد لـ 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 بشكل آمن في Go، مما يتيح إنشاء وإدارة التوقيعات الرقمية داخل تطبيقاتك.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3