douguluan5102 2016-10-25 05:10
浏览 56
已采纳

存储和检索RSA加密密钥

I am trying to build an API, but to secure it properly I believe I need to go with RSA encryption for a private key stored on my server and a public key for the client. I have stored the generated private key into a JSON file, I plan to store on my server but to write to JSON, I needed to convert the type too []byte. Now when I try to retrieve the private key to generate a public key, but it will not let me use type bytes for *Publickey The only other way I can think of to accomplish this goal is to seed the random number generator, so I can have the seed a secret on my server and then my private key should always generate to the same thing, any help this this would be great.

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条回答 默认 最新

  • dortmundbvb0624 2016-10-25 05:57
    关注

    You need to Unmarshal it:

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

    And you may use

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

    and

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

    See:

    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)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序