一文看懂Base64原理(并使用java实现)

简介: Base64编码解码算是网络安全领域的很小而且很简单的一个知识点了,虽然简单但是应用场景却极其广泛,可以这样说,开发者要是不懂Base64,基本上可以告别程序猿生涯了。这篇文章从原理入手,并给出java的Base64实现。方便你掌握Base64。

一、Base64由来


很早之前,电子邮件刚刚问世,那时候消息的传递都是英文,后来中国开通了互联网之后,对邮件的使用量也大量增加,这时候电子邮件就有了中文的需求。但是中文在传输的时候不能被有效地处理,这时候Base就出来了,Base64通过对这些中文进行编码,转化为服务器和网关能够识别的数据。这时候就能够使用电子邮件有效地传输了。


上面的这个例子不是说Base64专门为电子邮件而生的,从其诞生之初,就开始在各大领域有了广泛的应用。比如说网络上传递图片,我们可以Base64先对图片进行处理,然后就可以有效的传输了。


OK,我们大致知道其用途,然后我们就好好的分析一下他的原理,到底是如何对这些数据进行编码的。


二、Base64原理


1、Base64编码


Base64的原理超级简单,相信我们都知道ASCII 编码,从A-Z、a-z、0-9和一些其他的特殊字符,这些字符都有唯一的一个数字来表示。比如说a是97,A是65。我们来截取一部分图看一下:

v2-d31fb8d6a68a9cd03aba78ab131303c5_1440w.jpg

同理Base64也有这样一套编码。范围是”A-Z“、”a-z“、”0-9“、”+“、”/“一共64个字符。我们给出一个表格来看一下,这个比ASCII编码要简单多了,只有64个。

v2-5fe8b8c4fccd2a9a57e93fe853fd4874_1440w.jpg

由于索引是从0开始,所以最后的索引是63。在编码的时候Base64就是通过上面的进行转换编码的。下面我们就来看看Base64编码的原理。


2、基本原理


比如说有一封邮件,我们想要对其使用Base64进行编码。怎么办呢?基本步骤如下:

(1)对邮件的数据进行切分,每三个字节一组,一共24个bit。

(2)对切分后的数据重组,24个bit重组为4组,每组6个bit。

(3)对重组后的数据处理,每组最前面添加两个“0”,构成每组8个bit。此时一共32个bit。

(4)根据Base64编码表,获取相应的编码值。


此时一封完整的邮件,被切分重组处理之后就变成了Base64编码了。基本原理其实很简单。不过你不理解也没关系,我们直接上个实例来解释一下。


3、实例验证


比如说电子邮件里面出现了三个字母sky。我们要对这个三个字符使用Base64进行编码。

(1)对邮件的数据进行切分,每三个字节一组,一共24个bit

v2-0ca7b159f20b42641bef29e791539336_1440w.png

(2)对切分后的数据重组,24个bit重组为4组,每组6个bit

v2-5e08c47edbe5a22e37773d4feae67671_1440w.jpg

(3)对重组后的数据处理,每组最前面添加两个“0”,构成每组8个bit。由于在最前面添加的0,所以对数值不构成影响。

(4)根据Base64编码表,获取相应的编码值

v2-5214db988f42571b86c60275b0250af2_1440w.jpg

(5)完成编码的转换

v2-20e5b5771e8d155f2973a1ab5e8c9a7c_1440w.jpg

到这我们基本上就是实现了Base64编码机制从sky到c2t5的转换。


有些地方需要我们去注意一下:


(1)在第三步中,最前面添加了两个0,所以最终编码之后要比之前多出三分之一的大小。

(2)上面的例子中,我们使用的是ASCII编码,但是如果我们使用UTF-8,对应Base64编码的结果是不一样的。

(3)Base64只是进行了编码,方便数据的传输而已。这可不是加密。

原理也搞清楚了,现在我们就实现一下。


三、代码实现


你可以自己去实现一个编码解码的完整过程,但是java已经为我们封装好了,我们直接只用别人造好的轮子多好。不管是自己写还是使用别人的,原理搞清楚就OK了。

public class Test {
    public static void main(String[] args) throws IOException {
        String str = "sky";
        //编码
        BASE64Encoder encoder = new BASE64Encoder();
        String encoderResult=encoder.encode(str.getBytes());
        System.out.println("编码结果为:" + encoderResult);
        //解码
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] decoderResult=decoder.decodeBuffer(encoderResult);
        System.out.println("解码结果为:" + new String(decoderResult));
    }
}
//编码结果为:c2t5
//解码结果为:sky

是不是很简单。其实java实现的方式有很多种,其他的还有Commons Codec和Bouncy Castle。实现的过程和JDK提供的类似,我们只需要导入相应的jar包即可。\


Base64算法的应用场景有E-Mail、密钥、证书文件等等。这也只是入门,想要深入了解,可以看一些安全有关的书籍,不过很多都和数学有关,看的实在是难受,曾经看过,可惜没坚持住。惭愧,书到用时方恨少。

OK。有问题还请指正。

相关文章
|
1天前
|
设计模式 算法 Java
简单了解下Java中锁的概念和原理
Java的锁通过java代码实现,go语言的锁通过go实现,python语言的锁通过python实现。它们都实现的什么呢?这部分就是锁的定义和设计模式、算法、原理等一些理论上的东西。
9 1
|
2天前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
5 1
|
3天前
|
存储 安全 Java
深入剖析Java并发库:Exchanger的工作原理与应用场景
深入剖析Java并发库:Exchanger的工作原理与应用场景
|
3天前
|
存储 缓存 Java
深入剖析Java并发库(JUC)之StampedLock的应用与原理
深入剖析Java并发库(JUC)之StampedLock的应用与原理
深入剖析Java并发库(JUC)之StampedLock的应用与原理
|
1天前
|
监控 算法 Java
Java中的垃圾收集机制:原理与实践
在Java的内存管理领域中,垃圾收集(Garbage Collection, GC)扮演着至关重要的角色。本文旨在通过数据导向的分析,科学严谨地阐述垃圾收集的原理、类型及其对性能的影响,并结合逻辑严密的论证,探讨开发者如何有效管理内存以及优化GC策略。文章将引用实验证据和权威统计数据,深入解读垃圾收集器的工作机制,并通过实际案例展示如何调优以提高应用程序的性能。
5 0
|
2天前
|
存储 前端开发 Java
Java 代码执行的原理解读
Java 代码执行的原理解读
|
2天前
|
存储 监控 算法
深入理解Java虚拟机(JVM)原理与调优技巧
深入理解Java虚拟机(JVM)原理与调优技巧
|
2月前
|
存储 Java
java用base64编码案例
Java Base64编码示例:导入`java.util.Base64`,设置字符串`originalString`,使用`Base64.getEncoder().encodeToString()`编码并存储到`encodedString`,打印编码后字符串。解码用`Base64.getDecoder().decode()`。
33 0
|
9月前
|
存储 Java
使用Java进行Base64编码的示例
使用Java进行Base64编码的示例
85 1
|
人工智能 Java 对象存储
Java获取阿里云图片临时URL与图片文件转换Base64编码方法
在使用阿里云人工智能产品服务时,有部分服务需要上传的参数中包含文件URL,当我们没有开通OSS服务时,可以使用临时URL服务、或部分服务支持Base64编码格式,此文章为生成临时URL-JavaSDK方案与图片文件转换Base64编码方案。
1873 0