我正在使用ecdsa.GenerateKey
方法在Go中生成私钥/公钥对。我想将私钥存储在用户计算机上的文件中,并在程序启动时加载它。有一种方法elliptic.Marshal
编组公共密钥,但没有私钥。我应该简单地推出自己的产品,还是推荐存储私钥?如何将ECDSA私钥存储在Go中
6
A
回答
5
我相信这些密钥的标准格式是使用X.509 ASN.1 DER表示法。见http://golang.org/pkg/crypto/x509/#MarshalECPrivateKey和http://golang.org/pkg/crypto/x509/#ParseECPrivateKey。
3
这是一个代码示例,演示Go中编码和解码密钥。它有助于知道你需要连接几个步骤。密码算法是第一步,在这种情况下是ECDSA密钥。那么你需要标准编码,x509是最常用的标准。最后你需要一个文件格式,PEM又是常用的一个。这是目前最常用的组合,但可以随意替换任何其他算法或编码。
使用非对称加密(如OpenSSH的)通常存储在只有用户(和根在Linux/UNIX系统上,Windows上的Administrator)访问的文件私钥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. Javascript ECDSA获取私钥和公钥?
- 4. 如何存储RSA私钥,公钥
- 5. 如何将私人API密钥存储在源文件中?
- 6. Android中的私钥存储
- 7. 从base64字符串创建私钥ECDSA私钥
- 8. 如何在Silverlight 4中安全地存储密钥或私钥?
- 9. 如何在MS SQL Server中存储公钥/私钥?
- 10. 将私钥和公钥存储在数据库中
- 11. 将公钥/私钥安全地存储在数据库中
- 12. 从私钥中删除公钥私钥存储与GPG
- 13. GAE Go - 如何将私有变量放入数据存储?
- 14. 在数据库中存储私钥
- 15. 如何使用Bouncy Castle从Java中的ECDSA私钥获取公钥?
- 16. 私钥的安全存储
- 17. 使用DSACryptoServiceProvider存储私钥
- 18. 存储RSA私钥Android
- 19. 上传私钥到rundeck密钥存储
- 20. 将公钥和私钥存储在数据库或密钥库中
- 21. 如何在Android中安全地存储EC私钥?
- 22. 如何将私钥保存在安全的内存中
- 23. 如何将存储在HSM中的私钥转换为C#中的SignedXml.SigningKey?
- 24. 信任存储和密钥存储如何保护根证书和私钥?
- 25. WSO2 API Manager在哪里存储私钥
- 26. 在Web服务器上存储私钥
- 27. C#X509Certificate2:在哪里存储私钥?
- 28. 将Amazon S3密钥存储在私人回购中
- 29. 如何安全地存储公钥/私钥
- 30. 在充气城堡中生成ECDSA私钥会返回一个公共密钥
其他程序。在Linux/Unix上,通常使用'chmod 600〜/ private.key'来实现。更安全的系统将使用关键的提供者服务或系统从完全独立的系统提供私钥。这些带来了一些他们自己的警告和警告。 – Intermernet