(二)base64编码的前世今生

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(二)base64编码的前世今生相关的知识,希望对你有一定的参考价值。

参考技术A 1.   什么是BASE64编码

BASE64就是一种基于64个可打印字符来表示二进制数据的方法。换句话说,就是将二进制数编码成为64个可打印字符(符合ASCII编码规则)。

2.   为什么会出现BASE64 编码

最早的邮件系统只处理ASCII编码,ASCII码为7位有效码,一共包括。因此旧的邮件系统就会以为收到的8位字节码都是以ASCII编码的,并不理会最高位,或者简单粗暴的处理最高位,如:截断最高位。

后来,邮件的内容越来越丰富了,人们不仅想传输英文字符,还想传输如:中文(各种不同的编码),图片、视频(二进制文件)等更加丰富的内容。然而,这些内容的编码超出了ASCII码的范围,若不加以处理,这些编码在经过旧的邮件系统时,若最高位被截断了,信息就损失了,接收方没有办法判断发送过来的字符最高位是0还是1,也就无法正确还原发送方发出的数据。

怎么办呢?很简单,就是发送方把这些内容按照一定规则重新编码成符合ASCII码格式的编码,使其能够顺利通过那些问题邮件系统而不会有信息损失,接收方再按照对应的规则还原回来。

于是,当当当,BASE64应运而生,这样所有的二进制都可以转换成ASCII编码格式进行传输了。

3. BASE64 编码规则

1. BASE64编码基于以下64个可打印字符:A-Z、a-z、0-9、+、/。64个字符只需要使用6个bit即可完全表示(2的6次方为64)。

2. 二进制字符串转换成BASE64的方法是:

(1)每3个8位字符分隔为4个6位字符。(因为Base64的编码只有6个bit即可表示,而正常的字符是使用8个bit表示, 8和6的最小公倍数是24,所以4个Base64字符可以表示3个8位字符)。

(2)在6位字符的最高2位补0,查表可得对应的可打印字符。

(3)当二进制字节数少于3个,即二进制bit数不是6的倍数时:二进制位数补零直到bit数为6的最小公倍数,再按6位分隔查表得到对应的BASE64可打印字符;最后,将编码结果用“=”补齐为4个字符。【why?为了与原码中本来有的0进行区别】

例:将a进行BASE64编码为YQ==

4.   BASE64 的应用场景

什么情况下需要用到BASE64编码呢?那取决于BASE64都能做什么。经过BASE64编码后,数据变成了64个ASCII编码的数据,也就是说:

◉密码均是常用可见的字符

◉密码均由64个常用字符组成

◉无法一眼看出密码的内容

对应的,使用BASE64密码的动机可以归纳为:

◉将不可见字符转换为可见字符

◉对消息格式进行保护

◉对消息内容进行简单保护(防君子不防小人)

(1)将不可见字符转换为可见字符

◉ 网页中图片等二进制数据的BASE64编码

(参考: http://www.webhek.com/post/data-url.html

前端在实现页面时,对于一些简单的图片,为了避免浏览器加载外部资源,可以将图片内容直接嵌入到网页里。这就是浏览器的Data

URLs 的特性,它可以优化网站加载速度和执行效率。图片数据是二进制数据,没有办法描述。使用Base64对图片或其他文件的二进制数据进行编码后,这些数据就变成了可见字符。

(2)对消息格式进行保护

与邮件系统处理非ASCII编码会遇到的问题类似,其基本目的是保证发送方发出的内容经过网络传输后能够被正确的还原。这是处理包含特殊字符的消息最简单有效的实现方式,避免了发送方和接收方对消息中的字符进行逐个处理的复杂性。

◉ URL 与Cookie

URL通常以冒号和斜杠来对URL的内容进行分隔。URL中还会传递一些用户输入、二进制数据等参数。当这些内容中包含了冒号和斜杠等特殊字符时,若不加以处理,会影响WEB系统对URL格式的解析。因此,将参数内容进行BASE64编码以后再进行传输,就可以降低系统处理特殊字符的复杂性。同时发送者和接收者无须担心传输的内容会破坏HTTP分析程序的冒号、换行符或二进制值。

◉ Cookie

(参考: https://www.cnblogs.com/andy-zhou/p/5360107.html#_caption_0 )

Cookie是服务器通过HTTP头发送给客户端的数据,为了在HTTP头部无损的传递这些消息内容,通常也需要对cookie的内容进行base64编码。通常在cookie中传递的二进制数据包括图片、证书等。

注:由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_。

◉ 结构化文本

( 参考: https://blog.csdn.net/qq_27274997/article/details/78215934 )

一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?可以使用base64进行编码,然后存入xml,解码反之其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存。

(3)对消息内容进行简单保护(防君子不防小人,防外行不防内行),就不解释了。

    (参考: https://blog.csdn.net/waf1314/article/details/5107400 )

 

5.  BASE64 的误用

BASE64不能用于信息加密!很容易破解!

以上是关于(二)base64编码的前世今生的主要内容,如果未能解决你的问题,请参考以下文章

Base64编码详解

php Base64编码/解码

Base64编码算法

Base64编码 图片与base64编码互转

js 将图片转换为base64编码

将 Base64 编码图像加密为另一个有效的 Base64 编码图像