Golang使用json post编码/解码base64不';行不通
我在golang中构建了一个客户端和一个服务器,它们都使用这个函数来加密/解密Golang使用json post编码/解码base64不';行不通,json,encryption,go,base64,aes,Json,Encryption,Go,Base64,Aes,我在golang中构建了一个客户端和一个服务器,它们都使用这个函数来加密/解密 func encrypt(text []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } b := base64.StdEncoding.EncodeToString(text) ciphertext := make([]byte,
func encrypt(text []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
b := base64.StdEncoding.EncodeToString(text)
ciphertext := make([]byte, aes.BlockSize+len(b))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}
cfb := cipher.NewCFBEncrypter(block, iv)
cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))
return ciphertext, nil
}
func decrypt(text []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
if len(text) < aes.BlockSize {
return nil, errors.New("ciphertext too short")
}
iv := text[:aes.BlockSize]
text = text[aes.BlockSize:]
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(text, text)
data, err := base64.StdEncoding.DecodeString(string(text))
if err != nil {
return nil, err
}
return data, nil
}
服务器代码如下所示
requestContent := getRequestContentFromRequest(req)
url := requestContent["url"].(string)
undecryptedUrl := requestContent["urlCrypted"].(string)
decryptedurl, err := decrypt([]byte(undecryptedUrl))
if err != nil {
fmt.Println("Error: " + err.Error())
}
fmt.Println(decryptedurl)
func getRequestContentFromRequest(req *http.Request)
map[string]interface{} {
buf := new(bytes.Buffer)
buf.ReadFrom(req.Body)
data := buf.Bytes()
var requestContent map[string]interface{}
err := json.Unmarshal(data, &requestContent)
if err != nil {
fmt.Println(err)
}
return requestContent
}
其中getRequestContentFromRequest如下所示
requestContent := getRequestContentFromRequest(req)
url := requestContent["url"].(string)
undecryptedUrl := requestContent["urlCrypted"].(string)
decryptedurl, err := decrypt([]byte(undecryptedUrl))
if err != nil {
fmt.Println("Error: " + err.Error())
}
fmt.Println(decryptedurl)
func getRequestContentFromRequest(req *http.Request)
map[string]interface{} {
buf := new(bytes.Buffer)
buf.ReadFrom(req.Body)
data := buf.Bytes()
var requestContent map[string]interface{}
err := json.Unmarshal(data, &requestContent)
if err != nil {
fmt.Println(err)
}
return requestContent
}
现在来谈谈问题。
如果我在客户端加密我的字符串,然后直接解密,一切都会好起来
但是,当我将加密字符串发送到服务器并尝试使用与客户端中相同的函数对其进行解密时,decrypt函数会抛出一个错误
Error: illegal base64 data at input byte 0
我认为问题在于JSON的解组
谢谢你的帮助
附言
回购协议是
github.com/BelphegorPrime/goSafeClient和github.com/BelphegorPrime/goSafe
更新
示例JSON
{"url":"facebook2.com","urlCrypted":"/}\ufffd\ufffd\ufffdgP\ufffdN뼞\ufffd\u0016\ufffd)\ufffd\ufffd\ufffdy\u001c\u000f\ufffd\ufffd\ufffdep\ufffd\rY\ufffd\ufffd$\ufffd\ufffd"}
更新2
我做了一个操场问题是你在base64中编码了两次。第一次是在
encrypt
函数中,第二次是在JSON编组过程中。字节片由encoding/json
marshaller自动转换为base64字符串
解决方案是在调用decrypt
之前对base64字符串进行解码
榜样
编辑
工作解决方案问题是在base64中编码两次。第一次是在
encrypt
函数中,第二次是在JSON编组过程中。字节片由encoding/json
marshaller自动转换为base64字符串
解决方案是在调用decrypt
之前对base64字符串进行解码
榜样
编辑
工作解决方案错误是在解码base64数据时出现的,是什么让您认为问题在于对JSON进行解组?因为它在客户端使用相同的解密函数。没有任何错误。服务器上的“unencryptedrl”看起来与客户端上的“string(ciphertext)”相同。所以我认为从客户端到服务器的过程中出现了一些问题。变量名非常混乱-
unencryptedrl
是调用decrypt
之前的原始输入,所以它实际上是加密值,对吗?从decrypt
返回的值称为encryptedrl
,但它实际上是未加密的值,因为它是decrypt
的结果?是的,你是对的。我改变了这一点,希望现在不再那么混乱。JSON看起来像什么?由于urlCrypted
作为[]字节
进入,我认为它仍然是一个字节数组,这意味着当您取出数据时,您应该将其强制转换为[]字节
,而不是强制转换为字符串
,然后将字符串强制转换为[]字节
。这可能与问题有关。错误是在解码base64数据时出现的,为什么说问题是在解组JSON?因为它在客户端使用相同的解密函数。没有任何错误。服务器上的“unencryptedrl”看起来与客户端上的“string(ciphertext)”相同。所以我认为从客户端到服务器的过程中出现了一些问题。变量名非常混乱-unencryptedrl
是调用decrypt
之前的原始输入,所以它实际上是加密值,对吗?从decrypt
返回的值称为encryptedrl
,但它实际上是未加密的值,因为它是decrypt
的结果?是的,你是对的。我改变了这一点,希望现在不再那么混乱。JSON看起来像什么?由于urlCrypted
作为[]字节
进入,我认为它仍然是一个字节数组,这意味着当您取出数据时,您应该将其强制转换为[]字节
,而不是强制转换为字符串
,然后将字符串强制转换为[]字节
。这可能与问题有关。正如您可能已经看到的,我在“getRequestContentFromRequest”函数中正是这样做的。不,您不能在该函数中进行base64解码。在调用decrypt
之前,您必须对requestContent[“urlCrypted”]
进行base64解码。我在encrypt/decrypt函数中发现了几个问题。您必须在加密和解码后再进行编码,然后才能解密。否则,json封送器将接收一个带有不可打印字符的json字符串,并将再次在base64中编码。如果它收到base64字符串,它将按原样发送它。检查这里,正如您可能已经看到的,我在“getRequestContentFromRequest”函数中正是这样做的。不,在该函数中没有base64解码。在调用decrypt
之前,您必须对requestContent[“urlCrypted”]
进行base64解码。我在encrypt/decrypt函数中发现了几个问题。您必须在加密和解码后再进行编码,然后才能解密。否则,json封送器将接收一个带有不可打印字符的json字符串,并将再次在base64中编码。如果它收到base64字符串,它将按原样发送它。检查这里