#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