存储和检索RSA加密密钥

时间:2016-10-25 05:10:22

标签: json encryption go rsa decode

我正在尝试构建一个API,但为了正确保护它,我相信我需要使用RSA加密来存储在我的服务器上的私钥和客户端的公钥。我已将生成的私钥存储到JSON文件中,我计划存储在我的服务器上但写入JSON,我需要转换类型[]byte。现在,当我尝试检索私钥以生成公钥时,但它不允许我使用*Publickey的类型字节 我能想到实现这一目标的另一种方法是播种随机数生成器,这样我就可以在我的服务器上保存种子秘密,然后我的私钥应始终生成相同的内容,任何帮助,这将是大。

package main

import (
    "bytes"
    "crypto/rand"
    "crypto/rsa"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    mimicPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    buf := new(bytes.Buffer)
    json.NewEncoder(buf).Encode(mimicPrivateKey)
    secrets, _ := os.OpenFile("secrets.json",    os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
    // Close the secrets file when the surrounding function exists

    secrets.WriteString(buf.String())
    secrets.Close()

    secrets, _ = os.OpenFile("secrets.json", os.O_RDWR, 0666)
    serverKey, _ := ioutil.ReadAll(secrets)
    if serverKey != nil {
        fmt.Println("can not open key")
    }

    serverKeyPublic := &serverKey.PublicKey
}

1 个答案:

答案 0 :(得分:2)

你需要解组它:

var data *rsa.PrivateKey
err = json.Unmarshal(serverKey, &data)
if err != nil {
    panic(err)
}

你可以使用

err = ioutil.WriteFile("secrets.json", buf.Bytes(), 0666)

serverKey, err := ioutil.ReadFile("secrets.json")

请参阅:

package main

import (
    "bytes"
    "crypto/rand"
    "crypto/rsa"
    "encoding/json"
    "fmt"
    "io/ioutil"
)

func main() {
    mimicPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }
    var buf bytes.Buffer
    err = json.NewEncoder(&buf).Encode(mimicPrivateKey)
    if err != nil {
        panic(err)
    }
    err = ioutil.WriteFile("secrets.json", buf.Bytes(), 0666)
    if err != nil {
        panic(err)
    }

    serverKey, err := ioutil.ReadFile("secrets.json")
    if err != nil {
        panic(err)
    }
    var data *rsa.PrivateKey
    err = json.Unmarshal(serverKey, &data)
    if err != nil {
        panic(err)
    }
    serverKeyPublic := data.PublicKey
    fmt.Println(serverKeyPublic)
}