开始这篇文章之前,首先需要明白,Base64的主要用途并不是加密,而是将二进制数转换成方便在网络上传递的字符。
Base64只能算是一个编码算法,对数据内容进行编码从而适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是方式初级又简单(用于加密的话轻松就能破解就没有意义了)。
一、简介(什么是Base64)
这里直接沿用百度百科中的介绍:
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
可参考:《base64-百度百科》
二、原理(怎样进行编码)
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
1、规则
(1)把3个字节变成4个字节。
(2)每76个字符加一个换行符。
(3)最后的结束符也要处理。
2、Base64字母表(最后的到的Base64编码)
3、实例
例1:
转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
例2:
转换前 10101101,10111010,01110110
转换后 00101011, 00011011 ,00101001 ,00110110
十进制 43 27 41 54
对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。
三、Java中的Base64
Java上做Base64的编码与解码也是有一个进化的过程,从早期使用JDK中sun.misc.BASE64Encoder和sun.misc.BASE64Decoder两个类;到Apache Commons Codec提供的org.apache.commons.codec.binary.Base64;再到JDK8的java.util.Base64。效率可以说是越来越高,显而易见,我们还是推荐使用java.util.Base64的。
https://blog.csdn.net/zhou_kapenter/article/details/62890262
1、sun.misc.BASE64Encoder和sun.misc.BASE64Decoder
2、org.apache.commons.codec.binary.Base64
3、java.util.Base64
详细介绍后续配上代码实例进行补充。