【发布时间】:2018-08-06 12:35:31
【问题描述】:
我有一个返回 [] 字节的数据加密函数。当然,已经加密的内容必须在另一个微服务中(通过另一个函数)解密。
当我通过 JSON 发送 []byte 时会出现问题:[]byte 被转换为字符串,然后当我通过调用读取 JSON 时,结果不再相同。
我必须能够通过 JSON 传递由加密函数创建的原始 []byte,或者通过如下所示的调用传递 []byte。另一种可能是改解密功能,但我没有成功。
调用函数
func Dati_mono(c *gin.Context) {
id := c.Param("id")
oracle, err := http.Get("http://XXXX/"+id)
if err != nil {
panic(err)
}
defer oracle.Body.Close()
oJSON, err := ioutil.ReadAll(oracle.Body)
if err != nil {
panic(err)
}
oracleJSON := security.Decrypt(oJSON, keyEn)
c.JSON(http.StatusOK, string(oJSON))
}
通过 url 调用的函数
func Dati(c *gin.Context) {
var (
person Person
result mapstring.Dati_Plus
mmap []map[string]interface{}
)
rows, err := db.DBConor.Query("SELECT COD_DIPENDENTE, MATRICOLA, COGNOME FROM ANDIP021_K")
if err != nil {
fmt.Print(err.Error())
}
for rows.Next() {
err = rows.Scan(&person.COD_DIPENDENTE, &person.MATRICOLA, &person.COGNOME)
ciao := structs.Map(&person)
mmap = append(mmap, ciao)
}
defer rows.Close()
result = mapstring.Dati_Plus{
len(mmap),
mmap,
}
jsonEn := []byte(mapstring.Dati_PlustoStr(result))
keyEn := []byte(key)
cipherjson, err := security.Encrypt(jsonEn, keyEn)
if err != nil {
log.Fatal(err)
}
c.JSON(http.StatusOK, cipherjson)
}
加解密函数
func Encrypt(json []byte, key []byte) (string, error) {
k, err := aes.NewCipher(key)
if err != nil {
return "nil", err
}
gcm, err := cipher.NewGCM(k)
if err != nil {
return "nil", err
}
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
return "nil", err
}
return gcm.Seal(nonce, nonce, json, nil), nil
}
func Decrypt(cipherjson []byte, key []byte) ([]byte, error) {
k, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
gcm, err := cipher.NewGCM(k)
if err != nil {
return nil, err
}
nonceSize := gcm.NonceSize()
if len(cipherjson) < nonceSize {
return nil, errors.New("cipherjson too short")
}
nonce, cipherjson := cipherjson[:nonceSize], cipherjson[nonceSize:]
return gcm.Open(nil, nonce, cipherjson, nil)
}
一切正常,当我在c.JSON () 中打印cipherjson 时产生了问题:[]byte 被转换为字符串。
在调用函数读取和读取它时,它被读取为字符串,并且 ioutil.ReadAll () 创建读取字符串的 [] 字节。
相反,我必须能够将被调用函数中使用的 Encrypt 函数的返回值传递给 Decryot 函数。
希望我说清楚了,提前谢谢
【问题讨论】:
-
如果可以选择在微服务之间使用直接 TCP 连接,而不是 HTTP,则可以使用 Gob 对数据进行编码和解码,而无需将其转换为字符串:medium.com/@kpbird/…
-
发送二进制数据,使用gob、protobuf等,但是JSON是文本格式!
标签: json go httprequest