2014-01-24 35 views
6

我正在使用ecdsa.GenerateKey方法在Go中生成私钥/公钥对。我想将私钥存储在用户计算机上的文件中,并在程序启动时加载它。有一种方法elliptic.Marshal编组公共密钥,但没有私钥。我应该简单地推出自己的产品,还是推荐存储私钥?如何将ECDSA私钥存储在Go中

+2

其他程序。在Linux/Unix上,通常使用'chmod 600〜/ private.key'来实现。更安全的系统将使用关键的提供者服务或系统从完全独立的系统提供私钥。这些带来了一些他们自己的警告和警告。 – Intermernet

回答

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