12

Base64编码的前世今生

 3 years ago
source link: https://studygolang.com/articles/31116
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

起因

计算机以二进制形式(0和1)进行通信,但是人们通常希望与更丰富的表单数据(例如文本或图像)进行通信。 为了在计算机之间传输此数据,首先必须将其编码为0和1,然后发送,然后再次解码。 以文本为例-有许多不同的方法可以执行此编码。 如果我们都可以同意一个编码,那就简单得多了,但不幸的是事实并非如此。

最初创建了许多不同的编码(例如Baudot码),每个字符使用不同数量的位,直到最终ASCII成为每个字符7位的标准。 但是,大多数计算机将二进制数据存储在每个字节由8位组成的字节中,因此ASCII不适合传输此类数据。 有些系统甚至会擦除最高位。 此外,跨系统的行尾编码的差异意味着有时还会修改ASCII字符10和13。

为了解决这些问题,引入了Base64编码。 这样,您就可以将框架字节编码为已知可以安全发送而不损坏的字节(ASCII字母数字字符和几个符号)。 缺点是使用Base64编码消息会增加其长度-每3个字节的数据会编码为4个ASCII字符。

为了可靠地发送文本,您可以首先使用所选的文本编码(例如UTF-8)将其编码为字节,然后再对Base64进行编码,将生成的二进制数据编码为可安全发送为ASCII的文本字符串。 接收者将不得不逆转此过程以恢复原始消息。 当然,这要求接收者知道使用了哪种编码,并且该信息通常需要单独发送。

从历史上看,它已用于对电子邮件中的二进制数据进行编码,其中电子邮件服务器可能会修改行尾。 一个更现代的示例是使用Base64编码将图像数据直接嵌入HTML源代码中。 在这里,有必要对数据进行编码,以避免像“ <”和“>”这样的字符被解释为标签。

原理

base64 加密原理,是将待转换字符串转换为二进制并以三个字为一组(数据不足用 0 补足),每 6 位为一个索引组转换为十进制索引,通过索引在 base64 索引表中找到对应的字符作为编码后的字符(若原数据长度不是 3 的倍数时则对 3 取余余数为 1,则在编码结果后加2个=;若余数为 2,则在编码结果后加 1 个 =。)。

MfqyEn.png!mobile

aENbQ3q.png!mobile

base64 转换实例

以 helloworld 为例转换过程如下:

bque22A.png!mobile

经过上述步骤转后字符串为:aGVsbG93d29ybGQ=,到此一个完整的转码例子便完成了。

应用

base64 在需要网络通讯的场景下,有着非常广泛的应用场景,比如邮件的附件和图象传输,html img 标签的 src 属性也可以是 base64 编码的图片,还有我们常用的各类证书(支付证书,ssl 证书)的公钥和私钥..

Summary

base64 是一个很优秀的编码方式,他很好的解决了复杂文件在传输中的问题,也因此被广泛的应用在各种场景之中。关于 base64 的使用,你还需要知道如下几点:

  1. base64 转码后的长度会有所变化,会比源数据的长度多出大约 1/3
  2. base64 不具有加密特性,因此他不适用于加密的场景
  3. 由于 base64 字符中会有 +,/ 等字符,因此如果需要 url 传参的时候注意需要使用 URL 编码一下,否则有可能会导致接受到的数据无法正常解密的情况

References

维基百科 Why do we use Base64? What is base 64 encoding used for?

有疑问加站长微信联系

iiUfA3j.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK