一、什么是BASE64编码
在了解BASE64编码之前,首先回顾一下ASCII码:
- ASCII码:
ASCII(American Standard Code for Information Interchang)漂亮国信息交换标准代码。
ASCII 码使用7个二进制位来表示一个字符,7个二进制位刚好可以表示 128 ( 27 = 128)
个不同的字符。
包括了大小写字母、数字、标点符号 和一些不可见的控制符号。《ASCII码表》:
注:表中的ASCII字符可以用 “ Alt + 小键盘上的数字键 ”输出对应的ASCII 符号。
- BASE64:
Base64编码和我们熟悉的ASCII码一样,也是一种编码方式。而BASE64使用 **6个二进制位 **来表示一个字符。6个二进制位刚好可以表示64个(26=64)不同的字符;这也是BASE64编码名称的由来。
这些字符包括26个大写字母、26个小写字母、10个数字以及加号(+) 和斜线(/)两个特殊字符。
- 转换示例:
- 在命令行终端,使用echo 命令输出一个字符串:
echo "HelloWorld"
。
echo 命令的作用:是把我们输入的内容在原封不动地输出到终端上,经常会被用来在脚本中输出一些提示信息。
- 然后我们在这个命令的后面在加上一个竖线
echo "HelloWord" | base64
“|”符号的作用:它是一个管道符号,作用是将前面命令的输出作为后面命令的输入。将像一个管道一样,把数据从前面的命令传递给后面的命令,这样就可以把这两个命令串起来使用。
二、BASE64编码的原理和过程
2.1 转换编码对象为二进制
首先第一步是把要编码的字符串转换成二进制的形式
比如我们要编码 HelloWorld 的这个字符串,首先是需要将它转换为二进制形式:
这里的第一个字符大写字母的H的ASCII编码是72,对应的二进制是 01001000;
第二个字符e的ASCII编码是101, 对应的二进制位是 01100101 等等。
然后把这些二进制位按照从左到右的顺序排列起来,就得到这个字符串的二进制形式。
2.2 以6位为单位分组
将这个二进制的字符串按照 每6位一组 来分组。
如上图所示 第一组就是 010010,第二组就是 000110依次类推。
**注意: **如果最后一组的二进制位不足6位的情况下,就用0来补齐。
比如这里的最后一组的二进制位就只有4位,那么剩下的两位就用0来补齐。
2.3 转换成十进制并映射
第三步就是将每一组的二进制位转换成十进制的数字,在到Base64 编码表中找到对应的字符。
比如第一组的 010010 转换成十进制的数字 就是18,对应是字符就是大写字母S;
第二组 000110 转换成十进制的数字就是6 ,对应的字符就是大写字母G 等等。
这样就可以得到了编码之后的结果:
**注意:**在编码之后的长度需要是 **4的倍数 **如何不是的话,就需要在结尾的位置用等号来补齐
比如这里HelloWord 编码之后的长度是15个字符,不是4的倍数,那么久需要在最后补上一个等号,使它的长度变成16个字符,所以最后的结果就变成了之前在命令行终端中看到的样子。
以上就是整个编码过程。
相应的 解码的过程也就是把编码的过程反过来就可以了。
类似的除了Base64 编码之外,还要Base32编码、Base16编码等等。
原理都是一样的,只不过使用的二进制位数和编码表不同而已。
三、BASE64编码应用场景
由于Base64编码可以把任意的二进制数据转换成 **可打印的ASCII字符 **这样就可以方便的传输或者存储这些数据,所以被广泛应用在电子邮件、URL传递、数据存储等等场景中。
- 应用场景:
- 电子邮件附件
- URL参数传递
- 数据传输和存储
- Json Web Token(JWT)
- KubernetesI(Secret)
- 图像数据嵌入
以电子邮件传输为例,我们在发送邮件的时候,邮件的内容是以文本的形式传输的,如果邮件中包含了二进制数据,比如附件中的图片、视频、音频等等,那么这些二进制数据就需要经过Base64编码之后才能被传输。再比如安全领域中的JWT令牌、RSA数字签名等等都使用到了Base64编码。
Base64编码只是一种编码方式,并不是加密,它并不能够提供数据的保密性,所有的数据都是以明文的形式存储的,任何人都可以通过Base64编码的方式来解码得到原始的数据,所有如何你的数据需要保密的话,还是需要使用一些其它的加密算法来保证数据的安全性。