一文带你读懂base64编码

hi,大家好,我是开发者FTD。相信很多同学在工作中,经常会用到Base64编码,那大家知道为什么会有Base64编码吗?我们为什么要使用它呢,它又是怎么实现的呢?下面就让我们来一起深入探究一下Base64编码吧。

Base 家族

在开始之前,我们先给大家介绍一下Base家族。虽然我们在工作中使用最多的是Base64,但是Base家族可不止是只有Base64,除了Base64之外,Base家族还有Base32和Base16。

我们都知道ASCII 编码,ASCII 编码是用256(2的8次方)个字符,对二进制数据进行编码的方式,同样的

  • Base64 编码是用64(2的6次方)个字符,对二进制数据进行编码的方式

  • Base32 编码是用32(2的5次方)个字符,对二进制数据进行编码的方式

  • Base16 编码是用16(2的4次方)个字符,对二进制数据进行编码的方式

那Base家族有这么多编码形式,为什么偏偏使用Base64呢?

  • Base64 编码是用64(2的6次方)个特定的ASCII字符来表示256(2的8次方)个ASCII字符,也就是说三个ASCII字符经过Base64编码后变为四个的ASCII字符显示(公约数为24),编码后数据长度比原来增加1/3,不足3n用“=”补足。

  • Base32 编码就是用32(2的5次方)个特定的ASCII字符来表示256(2的8次方)个ASCII码,也就是说五个ASCII字符经过Base32编码后会变为八个ASCII字符显示(公约数为40),编码后数据长度比原来增加3/5,不足8n用“=”补足。

  • Base16 编码就是用16(2的4次方)个特定的ASCII字符表示256(2的8次方)个ASCII字符,也就是说一个ASCII字符经过Base16编码后会变为两个ASCII字符显示,编码后数据长度比原来增加一倍,不足2n用“=”补足。

从上面可以看出Base64编码后,长度增加是最少的,这也是我们选用Base64的一个重要原因。

Base64 简介

Base64顾名思义,就是基于64个可打印字符来表示二进制数据的一种方法,注意它并不是一种加密算法。对于64个打印字符,我们只需要6个二进制位就可以完全表示了。那么我们如何利用8个二进制位来表示只需要6个二进制位就可以完全表示的可打印字符呢?由于2的6次方等于64,所以我们可以将每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。

Base64是从二进制数据到字符的过程。所以计算机中所有的内容,包括文本、图片、音频、视频等等都可以使用Base64编码来表示。

Base64 编码原理

Base64编码就是使用64个字符作为一个基本字符集:

小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)

然后,所有其他符号都根据一定规则转换成这个字符集中的字符。

具体来说,Base64编码的转换方式可以分为以下四步:

  • 第一步,将每三个字节作为一组,一共是24个二进制位
  • 第二步,将这24个二进制位分为四组,每个组有6个二进制位
  • 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节
  • 第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值

Base64 编码的字符索引表如下所示:

数值字符数值字符数值字符数值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

有了这个字符索引表,我们就可以把任意的二进制转换成Base64的编码了,下面我们通过几个例子,给大家展示一下转换的过程。

1,假设现在有字符串 FTD 需要转换成base64的编码格式

base64

  • 第一步:“F”、“T”、“D” 字符对应的ASCII码值分别为70,84,68,对应的二进制值是01000110、01010100、01000100。如图第二三行所示,由此组成一个24位的二进制字符串。
  • 第二步:将24位二进制按照每6位二进制位一组分成四组。
  • 第三步:在上面每一组前面补两个0,扩展成32个二进制位,此时变为四个字节:00010001、00100101、00010001、00000100。分别对应的值(Base64编码索引)为:17、37、17、4。
  • 第四步:用上面的值在Base64 字符索引表中进行查找,分别对应:R、I、R、E。

因此字符串 “FTD” 经过Base64 编码之后就变为:RIRE 。

2,上面的例子中的字符正好是三个字节,如果字节数不足三个时该如何处理呢?下面我们以 FFT 分别举例说明如下:

base64-2

如上表所示,由于字符F的二进制为01000110,按照每6位进行分组,此时只能分成一组,第二组缺少4位,如果位数不足时,用0补齐;第三组和第四组完全没有数据,则用**=补上。因此,字符F经过Base64编码后得到的数值为Rg==**。

3,下面我们再看一下如果只有两个字符的情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BIpbsJ8y-1614862870049)(https://i.loli.net/2021/02/13/SF5zvPMbNTRtsh8.png)]

如上表所示,这个也属于位数不足,需要补位的情况。第一组和第二组按照正常的分组计算,第三组由于不足位数,最后两位补0,第四组完全没有数据,用**=补上。因此,字符FT经过Base64编码后得到的数值为RlQ=**。

关于中文的Base64编码

大家都知道中文编码有很多种,例如GB2312、GBK、GB18030,不同的汉字使用不同的编码格式进行编码后,它的二进制是不同的,所以在进行Base64编码后,他们的Base64编码的值也是不同的。这就要求我们在解码的时候需要注意原文的字符集格式,一定要保持一致才能正确解码。

例如:

中文 “【我是开发者FTD】公众号” UTF-8 格式的Base64 编码后的值是:44CQ5oiR5piv5byA5Y+R6ICFRlRE44CR5YWs5LyX5Y+3

中文 “【我是开发者FTD】公众号” GB2312 格式的Base64 编码后的值是:ob7O0srHv6q3otXfRlREob+5q9bausU=

Base64 是加密算法吗?

Base64 主要不是用来加密的,它主要的用途是把一些二进制数转成普通字符用于网络传输,这是因为一些二进制字符在传输协议中属于控制字符,不能直接在网络上传输。另外,还有一些系统中只能使用ASCII字符。Base64 编码就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。Base64 并不是安全领域下的加密解密算法,虽然有时候也会经常看到所谓的Base64加密解密算法。其实Base64只能算是一个编码算法,对数据内容进行编码来适合网络传输。虽然Base64编码过后原文也变成无法直接理解的字符格式,但是这种编码方式比较初级,很简单,很容易就可以被还原成原文,所以如果有比较重要的信息需要加密,一定要使用我们之前文章中介绍的那些加密算法进行数据的安全保护。

Base64 编码实现

Java语言中有多个库实现了Base64编码,不管哪一个库,最终的结果都是一样的。

JDK 提供的 Base64 编码实现:

public static String encode(String data) {return Base64.getEncoder().encodeToString(data.getBytes());
}public static String decode(String base64Data) {return new String(Base64.getDecoder().decode(base64Data));
}

Bouncy Castle 提供的 Base64 编码实现:

public static String encode(String data) {return new String(Base64.encode(data.getBytes()));
}public static String decode(String base64Data) {return new String(Base64.decode(base64Data));
}

Commons Codec 提供的 Base64 编码实现:

public static String encode(String data) {return Base64.encodeBase64String(data.getBytes());
}public static String decode(String base64Data) {return new String(Base64.decodeBase64(base64Data));
}

下面让我们用Java语言的实现来验证一下,我们第二章节的推理是否正确吧,代码如下:

public static void main(String[] args) {String ftd = "FTD";String ft = "FT";String f = "F";System.out.println("FTD base64 编码:" + encode(ftd));System.out.println("FT base64 编码:" + encode(ft));System.out.println("F base64 编码:" + encode(f));
}

输出结果为:

FTD base64 编码:RlRE
FT base64 编码:RlQ=
F base64 编码:Rg==

可以看到,和我们分析所得的结果是完全一样的。

查看完整代码请访问:

https://github.com/ForTheDevelopers/JavaSecurity

总结

Base64是我们在工作中经常用到,但是很少有人会深入研究一下它的实现原理,如果理解不当,甚至可能还会有人用它当做加解密用到业务系统关键位置,可能会引发比较严重的后果,相信大家看完上述的内容后,应该对Base64编码已经有了深刻的理解了吧。

技术人,技术魂,每天肝一篇技术文,ヾ(◍°∇°◍)ノ゙哈哈~

关于作者
  • GitHub:https://github.com/ForTheDevelopers
  • 掘金:https://juejin.cn/user/1204720472953022
  • CSDN:https://blog.csdn.net/ForTheDevelopers
  • 知乎:https://www.zhihu.com/people/forthedevelopers
  • segmentfault:https://segmentfault.com/u/for_the_developers
联系作者
  • 微信号:ForTheDeveloper

微信号

  • 公众号:ForTheDevelopers

公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不显示参数名_第51p,万能参数与返回值,Python中函数的返回值

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第51篇文章,第三阶段的课程:Python进阶知识:详细讲解Python中的函数(四)>函数的参数与返回值(下篇)。函数是非常…

阿里云服务器安装JDK指南

hi,大家好啊,好久不见,最近阿里云双十一做活动,很多博主都在做购买返现活动,不知道大家有没有去白嫖他们一个服务器,服务器买来可以用来学习一下服务器搭建,应用部署等等,可以做的事…

销售流程图_工作流程图网络图模板,招聘销售合同库存,完整设计拿来就用

Hello大家好,我是帮帮。今天跟大家分享一组工作流程图模板,招聘销售合同库存,完整设计拿来就用。为了让大家能更稳定的下载模板,我们又开通了全新下载方式(见文章末尾),以便大家可以轻松获得免费模板和收费模板。メ大家…

协议详解_I2C协议详解

I2C通信协议I2C通信协议的基础简介I2C「Inter-integrated Circuit」总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计。I2C是同步传输信号,关于同步和异…

http 302错误_http面试题

作者:忘れられたくない出自:SegmentFault 思否原文:segmentfault.com/a/1190000024538846http状态码分类1xx服务器收到请求2xx请求成功3xx重定向4xx客户端错误5xx服务端错误常见状态码200 成功301 永久重定向302 临时重定向304资源未被修改40…

controller属于哪一层_孺教网分享|家长层次有五层,家长们都来看看,你属于哪一层?...

经常听到这样一些话:养不教父之过,有其父必有其子。孩子是父母的影子,父母是孩子的第一任老师.......这些都反映了在孩子成长的过程中,家庭教育的重要性。而家庭教育往往体现在非智力因素方面,比如感恩、诚信、善良、尊…

cad里面f命令用不了_CAD出现命令无效、失灵等问题?不用慌,两招帮你快速解决...

一、CAD常见无效问题1、填充命令无效我们有时候需要对某一区域进行填充,但是却发现怎么也填充不出来,这个时候就应该检查一下【选项】设置了,具体操作步骤如下:①命令行中输入【OP】,按下回车键调出【选项】对话框&…

卫生纸玫瑰花折法5步_餐巾纸折纸玫瑰花的折法图解教程

餐巾纸折纸玫瑰花的折法图解教程折纸玫瑰花的制作方法非常的多,但是常见的折纸玫瑰花制作方法基本上都是以方形纸张进行折叠来制作而成的。这里介绍的这种折纸玫瑰的制作方法更加的简单、经济和环保一些。同时其有着一个极大的优点,那就是无论在哪里都可…

mysql status_mysql status查看

总结了几种查看MySQL运行状况的方法,如下:1、phpMyAdmin最简单的方式,在phpMyAdmin直接点击状态查看,详细如下图。这查看的是MySQL的一些运行状况数值,这种方式被大多数系统管理员所不齿,因为专业的MySQL服…

windows mysql 备份_Windows下MySQL数据库备份脚本(二) | 系统运维

说明:MySQL数据库安装目录:C:\Program Files\MySQL\MySQL Server 5.0MySQL数据库存放目录:C:\Program Files\MySQL\MySQL Server 5.0\dataMySQL数据库备份目录:D:\MySQLdata_Bak实现目的:备份MySQL数据库存放目录中的m…

mysql8解决区分大小写问题_球磨机“包球”和“饱磨”分不清?点进来快速区分,解决问题...

球磨机的“包球”和“饱磨”现象都是设备在磨矿过程中出现的常见故障,大多数用户对这两种情况不是特别了解,出现问题时也不知从何下手,导致机器无法正常作业。其实“包球”和“饱磨”有一定的相似之处,同时在产生原因、处理方法等…

控制浏览器增加新页签的js_技术网站重写复制按键 js 跳转到注册页,就能增加用户?...

背景技术网站重写复制按键的 js ,作为开发人员你会为了复制一段代码而注册一个用户吗?一个小需求变动,将跳转详情页改为 target_blank 的方式打开新页面。原来用 Vue.js 的路由代码 push 需要换成 resolve ,本文将介绍该需求调整过…

win7系统一直反复重启_iPhone7开机白苹果反复重启进不了系统维修过程

故障现象iPhone7开机时在出现苹果图标后反复重启,无法进入系统。维修过程拿到手机之后开机测试,在显示苹果图标界面反复重启。这种故障是开机过程不能通过自检造成的。由于客户要保留资料,所以是不能刷机。根据经验判断应该是基带部分有问题。…

mysql去掉小数点多余0_mysql数据库个性化需求:版本号排序

概述今天主要介绍一个MySQL数据库版本号排序问题,一起来看看吧~需求按版本号排序,版本号字段为字符类型,其中1.2.10应大于1.2.9,但mysql数据库会认为1.2.9大于1.2.1正确的版本号应该是 1.3.0 大于 1.2.231.2.10 大于 1.2.9实现sql…

mysql语句在哪编写_mysql常见问题七:编写sql语句

一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条)要求结果数据:原始数据:CREATE TABLEtbl_students (idint NOT NULL,namevarchar(10) DEFAULT NULL,sa…

sum()转字符串_Python字符串与内置函数

字符串创建变量来保存字符串 字符串可以通过单、双、三引号创建字符串message "Hello,world"#变量mseeage,值为hello,worldprint(message)输出结果:Hello,worldPython3,有3种数值类型分别为:int(整形)#创建变量为a,值为496a 496 #type查看类…

obj文件编辑软件_工程动画制作 | MAX文件导出obj、fbx格式在Bentley软件中应用

一、利用3dmax打开max模型,利用材质球吸取材质。看材质是否为标准材质(standard),如若是,继续下一步操作。如若不是,修改材质球属性,保留贴图为子材质,更改为标准材质。二、处理模型面数、点数问题。利用修…

python 安装pandas 权限不够_详解Python学习之安装pandas

一、python pip的安装与使用1、pip 是 python 包管理工具,该工具提供了对python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。python 2.7.9 或 python 3.4 以上版本都自带 pip 工具。pip 官…

java的类是什么_java类是什么意思

java类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。举一个例子说明下类,比如Person(人)就是一个类&#xff0…

java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度

一、什么是耦合程序之间的依赖关系:①类之间的依赖②方法之间的依赖注意:不可能完全的消除依赖关系,而只能是降低程序之间的依赖关系二、解耦降低程序之间的依赖关系:1.解决类之间的依赖关系:①通过读取配置文件来获取…