Хранение и извлечение ключа шифрования RSA

#json #encryption #go #rsa #decode

#json #шифрование #Вперед #rsa #расшифровать

Вопрос:

Я пытаюсь создать API, но для его надлежащей защиты, я полагаю, мне нужно использовать шифрование RSA для закрытого ключа, хранящегося на моем сервере, и открытого ключа для клиента. Я сохранил сгенерированный закрытый ключ в файл JSON, который планирую сохранить на своем сервере, но для записи в JSON мне также нужно было преобразовать тип []byte . Теперь, когда я пытаюсь извлечь закрытый ключ, чтобы сгенерировать открытый ключ, но это не позволяет мне использовать тип bytes для *Publickey Единственный другой способ, который я могу придумать для достижения этой цели, — это запустить генератор случайных чисел, чтобы у меня на сервере было начальное значение a secret, и тогда мой закрытый ключ всегда должен генерироваться для одного и того же, любая помощь в этом была бы отличной.

 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 := amp;serverKey.PublicKey
}
  

Ответ №1:

Вам нужно его отменить:

 var data *rsa.PrivateKey
err = json.Unmarshal(serverKey, amp;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(amp;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, amp;data)
    if err != nil {
        panic(err)
    }
    serverKeyPublic := data.PublicKey
    fmt.Println(serverKeyPublic)
}
  

Комментарии:

1. Спасибо, unmarshal работает отлично, ваши методы великолепны, еще раз спасибо.

2. Другой способ построения решения, исключительно в информационных целях gist.github.com/jshap70/259a87a7146393aab5819873a193b88c