Go实战 | url编码和base64编码原理及应用

Go实战 | url编码和base64编码原理及应用

大家好,我是「Go学堂」的渔夫子。今天跟大家聊聊在实际工作中遇到的对密文进行base64编码和url转义的一个案例。

关注微信公众号”Go学堂“,回复 mistakes ,领取 Go_100_mistakes:How to avoid them 原版pdf文档。

01 背景

最近在工作中有这样一个场景,有一个url,里面需要带着一个价格的参数进行调用。价格是比较敏感的数据,所以需要对价格进行加密传输,采用GCM对称加密方式。 但加密后的密文中有不可见的字符,在url中不能传输。所以要把所有的密文字符变成可见,所以使用到了base64编码。 在url传输,为了能够在url中安全的传输(所谓安全传输就是密文中不能存在url标准中已有明确定义的字符),所以又对base64编码进行了url编码, 传输的url如下: http://localhost?price=JuictpX63BaqJlg3%3AlJ2IoBW7niWCkLnL83tYs4Mp

price密文加密及编码过程如下:

encrypt_key := "jSUYHjkt7WTNx/XjLduwiD+xwJNN97dNgVE1M0y6Nk8="
plainText := "10"
cipherText := Encrypt(encrypt_key, plainText)
func Encrypt(encrypt_key string, plainText string) string {
    key, _ := base64.StdEncoding.DecodeString(encrypt_key)
    encryptBlock, _ := aes.NewCipher(key)
    aesGcm, _ := cipher.NewGCM(encryptBlock)
    nonce := make([]byte, 12)
    _, _ = io.ReadFull(rand.Reader, nonce)
    seal := aesGcm.Seal(nil, nonce, []byte(plainText), nil)
  // 这里打印的字符串是乱码
    fmt.Println("seal:", string(seal))
    cipherText := base64.StdEncoding.EncodeToString(nonce)+":"+base64.StdEncoding.EncodeToString(seal)
  //这里打印出的字符串包含 / 字符,该字符是url中用来分隔路径的
  fmt.Println("iv:content:", cipherText)
  // 这里对base64进行编码,转换成web安全的字符串