@qidiandasheng
2020-11-28T17:53:48.000000Z
字数 2056
阅读 1308
密码学
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
第一步,将每三个字节作为一组,一共是24个二进制位。
第二步,将这24个二进制位分为四组,每个组有6个二进制位(刚好6个二进制位可以表示64个字符)。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。
第四步,根据Base64字符集,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
Text content | M | a | n |
---|---|---|---|
ASCII | 77 | 97 | 110 |
Bit pattern | 01001101 | 01100001 | 01101110 |
第一步,"M"、"a"、"n"的ASCII值分别是77、97、110,对应的二进制值是01001101、01100001、01101110,将它们连成一个24位的二进制字符串010011010110000101101110
。
第二步,将这个24位的二进制字符串分成4组,每组6个二进制位:010011、010110、000101、101110。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节:00010011、00010110、00000101、00101110。它们的十进制值分别是19、22、5、46。
第四步,根据字符集得到每个值对应Base64编码,即T、W、F、u。
二个字节的情况
将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个"="号。
比如,"Ma"这个字符串是两个字节,可以转化成三组00010011、00010110、00000100以后,对应Base64值分别为T、W、E,再补上一个"="号,因此"Ma"的Base64编码就是TWE=。
一个字节的情况
将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个"="号。
比如,"M"这个字母是一个字节,可以转化为二组00010011、00010000,对应的Base64值分别为T、Q,再补上二个"="号,因此"M"的Base64编码就是TQ==。
以下这张是网上找的图片,转换过程看起来更直观一点:
Base64最早就是用于邮件传输协议中的,原因是邮件传输协议只支持ASCII
字符传递,如果要传输二进制文件,如:图片、视频是无法实现的。因此采用Base64将二进制文件内容编码为只包含ASCII
字符的内容。
我们知道在计算机中任何数据都是按ASCII
码存储的,而ASCII
码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。
Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。最初,Base64是为了解决电子邮件中无法直接使用非ASCII
字符的问题。一段数据先经过Base64编码统统变成可见字符,转为ASCII
字符串后,可以在接收端,通过Base64解码还原为原数据后,而无需担心传输过程中失真。
跨系统的行尾编码的差异意味着ASCII字符10(换行)和13(回车)有时也会被修改。比如我想发一条有两行文字的短信:
Hello,
world!
直接转换为ASCII发送(字节10在某些系统中已损坏):
72 101 108 108 111 44 10 119 111 114 108 100 33
通过base64编码后转为ASCII发送:
SGVsbG8sCndvcmxkIQ==
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。
电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
比如http协议当中的key value字段的值,必须进行URLEncode ,
因为一些特殊符号(等号或者空格)是有特殊含义的,造成混淆,解析失败,那么需要把这些值统一处理为可见字符,传输完再解析回来。
前端在实现页面时,对于一些简单图片,通常会选择将图片内容直接内嵌在页面中,避免不必要的外部资源加载,增大页面加载时间,但是图片数据是二进制数据,该怎么嵌入呢?绝大多数现代浏览器都支持一种名为 Data URLs 的特性,允许使用Base64对图片或其他文件的二进制数据进行编码,将其作为文本字符串嵌入网页中。