为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中存储 ECDSA 私钥

如何在 Go 中存储 ECDSA 私钥

Go
慕斯709654 2021-07-16 14:00:47
我正在使用该ecdsa.GenerateKey方法在 Go 中生成私钥/公钥对。我想将私钥存储在用户计算机上的文件中,并在程序启动时加载它。有一种方法elliptic.Marshal可以编组公钥,但没有对私钥进行编组。我应该简单地推出自己的,还是有推荐的方法来存储私钥?
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这是一个代码示例,演示了 Go 中密钥的编码和解码。知道您需要连接几个步骤会有所帮助。加密算法是第一步,在这种情况下是 ECDSA 密钥。然后你需要标准编码,x509 是最常用的标准。最后你需要一种文件格式,PEM 又是一种常用的格式。这是目前最常用的组合,但可以随意替换任何其他算法或编码。


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.")

    }

}



查看完整回答
反对 回复 2021-07-19
  • 2 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信