《illegal base64 data at input byte 42》问题分析与解决

文章讲述了前端将token存入cookie并经base64编码后,后台解码时出现illegalbase64dataatinputbyte42错误的原因,即浏览器自动URL编码导致字符不被Base64识别。解决方法在于确保编解码使用的字符集和规则一致,建议使用URLEncoding或RawURLEncoding进行编码和解码操作。
摘要由CSDN通过智能技术生成

背景

问题产生的背景是,前端把token放在了cookie中传给了后台接口,而token是一个base64编码后的字符串,拿到这个字符串之后,base64解码时产生了这个报错:illegal base64 data at input byte 42。
编解码对应的代码如下:

base64.StdEncoding.EncodeToString([]byte("encode")) // 编码
decode, err := base64.StdEncoding.DecodeString("decode") // 解码

原因分析

报错的原因是在解码时,遇到了base64不认识的字符,需要检查下字符串是否包含了非法的字符。这里的原因是浏览器会将cookie中的所有字符串数据自动url编码后再传输,从而导致了base64解码失败。
另外,如果编解码使用的规则不一致也会导致解码失败,比如编码使用的是StdEncoding,而解码使用的是RawStdEncoding,这两个编解码器一个是有填充的,一个是无填充的。

解决办法

在给出解决方案之前,我们先来看下base64包中这四个全局声明的编解码器的作用和区别,了解之后自然就能找到解决办法。

StdEncoding

// StdEncoding is the standard base64 encoding, as defined in
// RFC 4648.
var StdEncoding = NewEncoding(encodeStd)

翻译一下,StdEncoding使用的是RFC4648中规定的标准base64字符集来编解码,并且有填充,这个字符集中包含了+和/这两个url编码时会转换的字符。

URLEncoding

// URLEncoding is the alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
var URLEncoding = NewEncoding(encodeURL)

URLEncoding是RFC4648中规定的另一套备用base64编码字符集,并且有填充,常用于URL编码场景和文件名等。这个字符集中不包含url编码会转换的字符,也就是将+和/号分别替换为了-和_。

RawStdEncoding

// RawStdEncoding is the standard raw, unpadded base64 encoding,
// as defined in RFC 4648 section 3.2.
// This is the same as StdEncoding but omits padding characters.
var RawStdEncoding = StdEncoding.WithPadding(NoPadding)

RawStdEncoding使用的是标准的base64字符集进行编解码,并且无填充。

RawURLEncoding

// RawURLEncoding is the unpadded alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
// This is the same as URLEncoding but omits padding characters.
var RawURLEncoding = URLEncoding.WithPadding(NoPadding)

RawURLEncoding使用的是备用的base64字符集进行编解码,并且无填充。

所以,只需要使用URLEncoding或者RawURLEncoding来进行编解码,问题解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值