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安全的字符串