本文的主要内容:
1、Base64算法的由来与定义
2、Base64算法的原理
3、Base64编码与urlEncode编码的区别以及运用场景
4、代码实例(注意是否是遵循RFC2048)
Base64算法的由来
Base64算法最早应用于解决电子邮件传输问题,在早期,电子邮件只支持ASCII码字符。如果要传输一封带有非ASCII码字符的电子邮件,当它经过部分网关时就可能出现问题,这个网关可能会对非ASCII码字符的二进制位进行调整,即将这个非ASCII码的8位二进制码最高位置设置为0,此时用户收到的这个邮件就会是一封乱码的了。基于这个原因产生了Base64算法。
Base64是一种基于64个字符的编码算法。经过Base编码后的数据会比原始数据略长,为原来的4/3。经过Base64编码的字符串的字符数是以4为单位的整数倍。
RFC2045规定,在电子邮件中,每行为76个字符,每行末尾添加一个回车换行符(“\r\n”),无论每行是否够76个字符,都要加一个回车换行符。但实际情况中往往要忽略这一点。
我经常听到有人说Base64加密,听着十分变扭。准确地说,Base64是一种编码。
Base64算法的原理
在RFC2045中规定的字符映射表:
这张字符映射表中,Value指的是十进制编码,Encoding指的是字符,共映射了64个字符,这也是Base64算法命名的来源。映射表的最后一个字符是等号,它是用来补位的。
为了能在HTTP请求中以GET方式传递二进制数,由Base64算法衍生出了Url Base64算法。Url Base64主要是替换了Base64字符映射表中的第62、63个字符,也就是将”+”和”/”符号用”-“和”_”代替。至于”=”在Bouncy Castle提供者使用的是”.”代替,而在Commons Codec里则是完全杜绝使用补位符。
Base64算法主要是将给定的字符以及字符编码(如ASCII码、UTF-8码)对应的十进制数为基准,做编码操作:
- 将给定的字符串以字符为单位,转换成对应的字符编码(如ASCII码)
- 将字符编码转换成二进制
- 将二进制码进行分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是一个分组变化的过程,3个8位二进制码和4个6为二进制码的长度都是24位
- 将获得的4-6二进制码组进行补位,向6位二进制码高位补2个0,组成4个8位二进制码 <