出现背景
用记事本直接打开密文,我们会发现出现了乱码,这是因为密文每八位二进制经过编码后有可能变为无法显示和打印的字符,这就造成了乱码。Base64则能将不可打印或者显示的字符转为可读的ASCII(国际标准)字符(A-Z、 a-z、 0-9、 /、 +、)。Base64属于Base编码的一种,除了Base64,还有Base32、Base16,相对来说,Base64增加的长度最少,所以被使用的也最为广泛。
使用场景
(1)网络间传输的内容
协议中为了正常传输数据,会有各种各样的转义字符,而使用Base64则可以降低数据在传输过程中出错的可能性,增加可靠性以及提升效率。
(2)纯文本协议
常见文本协议:HTTP超文本传输协议、SMTP 简单邮件传输协议、FTP 文件传输协议、DNS 域名系统、XML 协议、XMPP 协议等。在使用这些协议传输数据时,需要对数据进行处理,将其转为可读的字符。由于Base64的字符范围为“A-Z a-z 0-9 / +”,还有补充字符“=”,以及每76个字符添加一个换行符“\n”,其中“+”、“\n”和“=”都会在URL中被转为别的字符,,而在URL中“+”会被转换为空格,“\n”会被解释为换行,“=”会被解释为赋值,所以会用urlencode进行编码。
(3)DataURL
HTML中用DataURL内联小图片,节省HTTP请求,加快网页呈现速度
(4)数字证书
.pem后缀的文件,是ASCII文本格式。在DER格式或者其他二进制数据的基础上,使用BASE64编码为ASCII文本,以便于在仅支持ASCII的环境中使用二进制的DER编码的数据。
编码方式
数据在计算机内部都是以二进制方式表示,是根据各种编码方式变为了有语义的字符,主要编码方式有ASCII编码、拓展ASCII编码、Unicode编码以及GB2312
ASCII编码 | 拓展ASCII编码 | Unicode编码 | GBK/GB2312/GBB18030 |
用于表示英文,第一位规定为0,剩下七位进行编码。 | 为了解决欧洲国家英文字符上有拼音的问题,将第八位利用上了,但不同国家拓展ASCII编码代表的字符是不同的,即拓展ASCII编码与字符不是一一对应的。 | Unicode编码与字符是一一对应的,但严格来说Unicode只是一种符号集,因为它并没有解决如何存储这些字节,有的国家一个字节代表一个字符,有的国家二个字节代表一个字符。 所以后面出现了编码方式:UTF-8、UTF-16、UTF-32。UTF-8是最常用的,属于变长的编码方式,用1-4个字节来表示。 |
GBK和GB2312都是针对简体字的编码,只是GB2312只支持六千多个汉字的编码,而GBK支持1万多个汉字编码。而GB18030是用于繁体字的编码。汉字存储时都使用两个字节来储存。 |
Base64是可以逆转换的,是对数据的一种编码方式,不属于加密的一种方法。
原理
Base64严格来说共使用了ASCII字符集中的65个字符(A-Z a-z 0-9 / + =),其中=用于不满3n个字节,并且需要补充1-2个字节的情况,补充一个字节则用=代替。在ASCII编码中八比特一编码,在Base64编码中六比特一编码,六和八的最小公倍数为24,所以三个字节经过BASE64编码后正好能变成四个字节,数据量增加了25%。
处理流程:将文本转为二进制,然后对其进行BASE64编码,然后转为二进制,又对其进行ASCII编码,则最终得到的文本全都是可显示字符,不会出现乱码等情况。
在介绍Base64编码前,首先看看ASCII编码与BASE64编码对应表。
二进制 | 十进制 | 十六进制 | ASCII编码 | BASE64编码 |
0 | 0 | 0 | NUL (NULL)空字符 | A |
1 | 1 | 1 | SOH (Start Of Headling)标题开始 | B |
10 | 2 | 2 | STX (Start Of Text)正文开始 | C |
11 | 3 | 3 | ETX (End Of Text)正文结束 | D |
100 | 4 | 4 | EOT (End Of Transmission)传输结束 | E |
101 | 5 | 5 | ENQ (Enquiry)请求 | F |
110 | 6 | 6 | ACK (Acknowledge)回应 | G |
111 | 7 | 7 | BEL (Bell)响铃 | H |
1000 | 8 | 8 | BS (Backspace)退格 | I |
1001 | 9 | 9 | HT (Horizontal Tab)水平制表符 | J |
1010 | 10 | 0A | LF/NL(Line Feed/New Line)换行键 | K |
1011 | 11 | 0B | VT (Vertical Tab)垂直制表符 | L |
1100 | 12 | 0C | FF/NP (Form Feed/New Page)换页键 | M |
1101 | 13 | 0D | CR (Carriage Return)回车键 | N |
1110 | 14 | 0E | SO (Shift Out)不用切换 | O |
1111 | 15 | 0F | SI (Shift In)启用切换 | P |
10000 | 16 | 10 | DLE (Data Link Escape)数据链路转义 | Q |
10001 | 17 | 11 | DC1/XON(Device Control 1/Transmission On)设备控制1/传输开始 | R |
10010 | 18 | 12 | DC2 (Device Control 2)设备控制2 | S |
10011 | 19 | 13 | DC3/XOFF(Device Control 3/Transmission Off)设备控制3/传输中断 | T |
10100 | 20 | 14 | DC4 (Device Control 4)设备控制4 | U |
10101 | 21 | 15 | NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收 | V |
10110 | 22 | 16 | SYN (Synchronous Idle)同步空闲 |