什么是 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. LeetCode653. 两数之和 IV - 输入 BST

    题目 直接暴力 1 class Solution { 2 public: 3 vector<int>ans; 4 bool findTarget(TreeNode* root, int k ...

  2. kubectl命令管理

    kubectl命令管理 查看更多帮助命令 [root@k8s-master ~]# kubectl --help 创建一个命名空间 [root@k8s-master ~]# kubectl creat ...

  3. centos7安装vsftpd最大的坑

    1.检查用户和密码没有错误2.vsftpd.conf配置没有错误3.检查/etc/vsftpd/vsftpd.conf  里面pam_service_name =vsftpd4.终极boss查看vim ...

  4. 使用idea插件识别log文件的相关设置

    最近要读一些spring boot项目产生的log文件,众所周知,idea拥有强大的插件系统.当我打开log文件时,idea自动帮我推荐了ideolog这个插件. 但是当我安装好之后发现系统并不能完全 ...

  5. ASP.NET MVC--sqlserver数据库脚本的导入导出

    1.右键选择数据库---任务----生成脚本 2.弹出如下框 导出整个表,默认下一步,否则选择特定数据库对象表单选框 3.修改文件名路径,可以保存脚本到制定路径,否则为默认,点击高级进入 要编写脚本的 ...

  6. 【高并发】ReadWriteLock怎么和缓存扯上关系了?!

    写在前面 在实际工作中,有一种非常普遍的并发场景:那就是读多写少的场景.在这种场景下,为了优化程序的性能,我们经常使用缓存来提高应用的访问性能.因为缓存非常适合使用在读多写少的场景中.而在并发场景中, ...

  7. Vue使用Ref跨层级获取组件实例

    目录 Vue使用Ref跨层级获取组件实例 示例介绍 文档目录结构 安装vue-ref 根组件自定义方法[使用provide和inject] 分别说明各个页面 结果 Vue使用Ref跨层级获取组件实例 ...

  8. 在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结. 其实我也是一个新手,机缘巧合 ...

  9. LOJ104 普通平衡树

    题目描述 这是一道模板题. 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入  x 数: 删除  x 数(若有多个相同的数,因只删除一个): 查询  x 数的排名(若 ...

  10. form(form基础、标签渲染、错误显示 重置信息、form属性、局部钩子、全局钩子)

    form基础 Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from django im ...