什么是 Base64 编码

Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程。

使用场景

数据加密或签名通过 Base64 转换为字符串存储或传输。

不能传输文件的网络环境可以转换 Base64 进行网络传输。

在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源。

在 URL、网页中传输少量二进制数据等等。

Base64 编码原理

原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重新划为 4 组(每组为 6位,高位补两个 0 为 8 位后作为一个新字节,划分后的每个字节数值的范围是 00000000 - 00111111 即十进制的 0 - 63),然后将划分后的字节的数值作为索引查编码表,获得相应的字符,从而得到编码后的字符串。通过 64 个字符来对任意数据进行编码,因此称为 Base64。

Base64 标准编码表:

以字符串 “NEW” 为例,对其 Base64 编码:

如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 有效的字节。将这样处理,将其用 0 补充至 6 的最小倍数位后,剩余的空位将使用 “=” 填充处理。例如:



经过 Base64 编码后数据会增大,数据经过 Base64 处理后,由原来每 3 个字节,变为为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。

对于字符内容,相同字符串不同的字符编码(如 utf-8 与 gbk)的 Base64 编码结果会不一样。Base64 是一种通过查表的编码方法,不能用于加密,即使是自定义编码表也不行。

JDK 内置的 Base64 API

在 JDK 7 之前可以使用 sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 来 Base64 编码解码,但 com.sun 开头的包不是公开的,属于 sun 的内部方法,不建议使用。所以可以使用 Apache 提供的工具包(commons-codec-1.11.jar)来进行 Base64 编码解码。

从 JDK 7 开始 Oracle 发表了声明,不希望 Java 程序调用 JDK 系统包中以 sun 开头的类(https://www.oracle.com/technetwork/java/faq-sun-packages-142232.html)。

从 JKD 8 开始,Oracle 已经把 Base64 进行优化并放到 JDK 的 java.util 包,所以推荐直接使用 java.util.Base64 进行 Base64 编码和解码。

// Base64 编码
String encoder = Base64.getEncoder().encodeToString("但愿人长久 千里共婵娟".getBytes());
System.err.println(encoder); // Base64 解码
String decoder = new String(Base64.getDecoder().decode(encoder));
System.err.println(decoder); // 结果
// 5L2G5oS/5Lq66ZW/5LmFIOWNg+mHjOWFseWpteWonw==
// 但愿人长久 千里共婵娟

标准的 Base64 编码中可能出现字符 + 和 / 字符,不能直接用在 URL 中,需要对其进行处理,把字符 + 和 / 分别变成 - 和 _ ,JDK 也提供了对应的方法。

// URL安全的 Base64 编码
String safeEncoder = Base64.getUrlEncoder().encodeToString("但愿人长久 千里共婵娟".getBytes());
System.err.println(safeEncoder); // URL安全的 Base64 解码
String safeDecoder = new String(Base64.getUrlDecoder().decode(safeEncoder));
System.err.println(safeDecoder); // 结果
// 5L2G5oS_5Lq66ZW_5LmFIOWNg-mHjOWFseWpteWonw==
// 但愿人长久 千里共婵娟

小结

Base64 是基于 64 个可打印字符来表示任意二进制数据的方法。

Base64 通常用于数据加密或签名后转换为可见字符串,文本资源(如 HTML 和 CSS 中)中嵌入图片文件等等。

原理是把二进制数据每 3 个字节重新划为 4 组(每三个 8 位字节,即总共24位,可以由四个 6 位 Base64 数值表示),然后作为索引查编码表,获得相应的字符,从而得到编码后的字符串。

经过 Base64 编码后数据会增大,因为每 3 个字节,重新划分为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。

Base64 是一种通过索引查表的编码方法,不能用于加密。


参考:

https://en.wikipedia.org/wiki/Base64

https://www.ietf.org/rfc/rfc4648.txt

https://www.liaoxuefeng.com/wiki/897692888725344/949441536192576

Base64 编码原理的更多相关文章

  1. BASE64编码原理分析脚本实现及逆向案例

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容.   01编码由来 数 ...

  2. Atitit.Base64编码原理与实现设计

    Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...

  3. Base64编码原理及应用

    最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压 ...

  4. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

  5. Base64编码原理与应用

    本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...

  6. 一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  7. 一篇文章彻底弄懂Base64编码原理(转载)

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  8. 知识扩展——(转)一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...

  9. 一篇文章彻底搞懂base64编码原理

    开始 在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现. base64是什么东东呢? Base64 ...

随机推荐

  1. 给mysql选择调度策略

    在gun/linux上,队列调度决定了到块设备的请求实际上发送到底层设置的顺序.默认情况下是cfg(完全公平排队)策略,随意使用的笔记本和台式机使用中个调度策略没有问题,并且有助于防止io饥饿,但是用 ...

  2. 【ORA】ORA-01078和LRM-00109 解决方法

    今天切换到asm实例的时候,发现是一个空实例,尝试启动实例,结果报错ORA-01078和LRM-00109 SQL> startupORA-01078: failure in processin ...

  3. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  4. 代码审计 - BugkuCTF

    extract变量覆盖: 相关函数: extract()函数:从数组中将变量导入到当前的符号表.把数组键名作为变量名,数组的键值作为变量值.但是当变量中有同名的元素时会默认覆盖掉之前的变量值. tri ...

  5. MongoDB查询优化--explain,慢日志

    引入 与Mysql数据库一样,MongoDB也有自己的查询优化工具,explain和慢日志 explain shell命令格式 db.collection.explain().<method(. ...

  6. IP2726中文规格书

    IP2726_AC_FBR 是一款集成多种协议.用于USB-A 和 TYPE-C 双端口输出的快充协议 IC.支持多种快充协议,包括 USB TypeC DFP,PD2.0/PD3.0/PPS ,HV ...

  7. Elasticsearch从入门到放弃:浅谈算分

    今天来聊一个 Elasticsearch 的另一个关键概念--相关性算分.在查询 API 的结果中,我们经常会看到 _score 这个字段,它就是用来表示相关性算分的字段,而相关性就是描述一个文档和查 ...

  8. 前端面试之HTTP

    前端面试之HTTP的基本性质 1 HTTP代理 在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息.简而言之,他们中间的部分就是代理! 代理的作用 缓存(可以是公开的也可以是私有的,像浏览 ...

  9. VMware中安装Ubuntu后,安装VMwareTools提示“Not enough free space to extract VMwareTools-10.3.10-13959562.tar.gz”的解决办法

    将加载后的Vmware Tools中的*.tar.gz文件复制到桌面后提取,否则会报错:

  10. MySQL调优之索引优化

    一.索引基本知识 1.索引的优点 1.减少了服务器需要扫描的数据量 2.帮助服务器避免排序和临时表 例子: select * from emp orde by sal desc; 那么执行顺序: 所以 ...