介绍
首先 Base64 是一种编码算法,严格意义上不是加密算法。其输入源为二进制数据,输出为文本数据。 既然其不是加密算法,我们为什么要使用呢。
原因主要是通过base64算法,我们可以将很多不同类型的信息先转换为二进制数据,然后转换为文本数据,加以传输和存储。而且由于base64的特性,其大小增加很有限,编码后,不会明显扩大原有文件的大小。
伪代码:
byte[] byteArray = {0, 2, 3 ,4, 127};
String encryptedText = Base64(byteArray);
这里,encryptedText 不可人眼直接识别,不知道加密算法情况下也无法确认信息内容,从而实现加密的目的。
实现
首先Base64算法的输出文本只有64个,从A-Z, a-z, 1-9,+,/ 这64个字符。也就是说任何输入的二进制数都会被编码成这64个字符中的一个。
那么很容易联想到,, 所以就是将输入的二进制串6个一组,加密成字符串。如果不足6位,则低位补0。通过上述表格映射成对应的字符,最后形成结果字符串。
⚠ 需要注意的是,生成的 encryptedText 的长度必须为 4 的倍数。否则需要在末尾补上对应缺少个数的“=”。比如生成的 TQ ,就因为长度不满足4的倍数,在后面补了两个“=”。
使用场景
Base64 的使用场景有很多,这些都是属于需要传输文本,但是不适合被直接看到内容的情况。
✅例如,在MIME格式的电子邮件中会使用Base64算法进行加密传输。通过Base64的加密,其大小增长非常有限仅仅接近 8/6,属于完全可控的范围。
✅又例如在JWT(Json Web Token)的signature的加密中,使用到了变种的Base64算法Base64url。其区别是将“+”和“/” 替换为了 “-”和“_”。而且去掉了padding部分,也就是不会补齐 “=”。 引用一下官方文档的解释:
JWT uses a variant of Base64 encoding that is safe for URLs. This encoding basically substitutes the “+” and “/” characters for the “-” and “_” characters, respectively. Padding is removed as well. This variant is known as base64url . Note that all references to Base64 encoding in this document refer to this variant.
✅Base64 算法是很适合在HTTP环境下使用的,因为HTTP是以传输文本为主的协议,而Base64算法正好可以把传输内容变成文本。