Base64简介
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息,具有不可读性,需要解码后才能阅读。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
简单来说,Base64就是一种字符映射规则,通过这种字符映射规则的编码方式称为Base64编码。由于编码表由64个基础可打印字符组成,在传输的字符并不全是可打印的字符,比如二进制文件、图片等的时候,能避免在传输过程中丢失数据(不可打印字符在传输过程中可能会被当做特殊字符处理,从而导致丢失)。
编码原理
索引表
索引表字符选用了由标准的Base64协议规定的"A-Z、a-z、0-9、+、/" 这64个可打印字符。
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
---|---|---|---|---|---|---|---|
0 | A | 1 | B | 2 | C | 3 | D |
4 | E | 5 | F | 6 | G | 7 | H |
8 | I | 9 | J | 10 | K | 11 | L |
12 | M | 13 | N | 14 | O | 15 | P |
16 | Q | 17 | R | 18 | S | 19 | T |
20 | U | 21 | V | 22 | W | 23 | X |
24 | Y | 25 | Z | 26 | a | 27 | b |
28 | c | 29 | d | 30 | e | 31 | f |
32 | g | 33 | h | 34 | i | 35 | j |
36 | k | 37 | l | 38 | m | 39 | n |
40 | o | 41 | p | 42 | q | 43 | r |
44 | s | 45 | t | 46 | u | 47 | v |
48 | w | 49 | x | 50 | y | 51 | z |
52 | 0 | 53 | 1 | 54 | 2 | 55 | 3 |
56 | 4 | 57 | 5 | 58 | 6 | 59 | 7 |
60 | 8 | 61 | 9 | 62 | + | 63 | / |
在Base64的编码结果中我们还会看到“=”或“==”出现,“=”在此是作为填充字符出现。
转换步骤
- 将待转换的字符串每三个字节分为一组,共24位:
下面以字符串"Man"为例,当前分组即为每个字节一组:[01001101],[01100001],[01101110]
。 - 将这24位字符按每6个为一组重新分组,并在每个新的分组前加两个0:
新的分组:[010011],[010110],[000101],[101110]
加0后:[00010011],[00010110],[00000101],[00101110]
新增8位,此时,总字节数变为4个字节,分别为9,22,5,46。 - 按新的字节对应上面的索引表获取编码后的字符,即字符串"Man"经过Base64编码后得到的字符串为"TWFu"。
补零处理
通过不断将每3个字节转换为4个Base64字符之后,最后只会出现以下3种情况:
- 没有字节剩下
- 还剩下1个字节
- 还剩下2个字节
第一种情况不用做处理,后面两种情况采用补零的方式,最后一个6位分组差几位就补几位0,即剩1个字节的时候补4位0,剩2个字节的时候补2位0:
这里的0也就是我们在Base64编码尾部经常见到的“=”的来历,每补2个0就会添加1个“=”。尽管不填充“=”时我们也能根据实际对剩余字符进行处理,但是这种填充在某些情况下是必需的,例如当需要将多个Base64编码文件合并为一个文件的时候。
其他
- Base64编码只是一种编码规则,只是无法直接看到明文,不能算得上加密。尽管我们可以通过打乱Base64编码的索引表来达到加密的效果,但是考虑到Base64编码的编码过程实际上就是一种字符替换法,可以通过观测基于词频和字母频率的统计规律较为轻易地获得秘钥,因此安全性并不能得到有效的保证。
- 不同中文编码下,如gb2312、utf-8,对应的Base64编码也不一样。
- Base64编码根据索引表的不同有很多变种,例如将“+”、“/”改为“-”、“_”,同时去除“=”的填充,就可以将其用于URL传输。
参考文献:
[1]: 百度百科 https://baike.baidu.com/item/base64
[2]: 维基百科 https://www.bk.gugeso.site/wiki/Base64