Base64编码是最常见的编码方式(使用64个字符表示任意8bit字节序列),是一种基于64个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程。

使用场景

  • 数据加密后通过Base64转换为可见字符串存储
  • URL(需要Url安全的Base64)、Cookie、网页中传输少量二进制数据
  • 将二进制数据(比如图片)保存在文本文件中
  • 不能传输二进制文件的网络环境可以转换Base64在进行网络传输

Base64原理

【Base64编码表】

对二进制数据进行处理,把每3个字节(每个字节为 8bit, 3个字节为24bit)重新划为4组(每组为6bit后,高位补两个 0 为8bit 后作为一个新字节。划分后对应的二进制数值范围是 00000000 - 00111111(十进制范围 0 - 63),正好和码表字符个数对应。), 然后将划分后的字节转换为4个数字作为索引查编码表,获得相应的4个字符,从而得到编码后的字符串。

以字符串 “ABC” 为例,将其Base64编码:

“ABC” 的二进制为 -> 01000001 01000010 01000011

如果要编码的数据二进制位数不是3的倍数,那么最后会在编码的末尾加上1个或2个 = 号进行补足,表示补了多少字节,解码的时候会被去掉。

以字符串 “A” 为例,将其Base64编码:

“A” 的二进制为 -> 01000001

Base32 和 Base16

除Base64外 ,还有不常用的Base32 和 Base16编码,Base32 是将 5个字节拆分为8组,Base16是将 1个字节拆分为2组, 和Base64编码原理是一样的。

Base32:使用26个大写字母A-Z和数字2-7的32个字符做为字符集。Base32字符集中省略了1,0等数字,记忆或手写它们,容易与字母 I, O 混淆。

【Base32编码表】

Base16:使用数字0-9和字母A-F或小写a-f的16个字符做为字符集。

【Base16编码表】

Base64编码后会使数据增大

因为Base64对二进制数据进行处理时,会将每3个字节(每个字节8bit,共为24bit),划分为4个字节,会使数据增大。

JDK提供的Base64编码方法

在Java7之前可以使用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中,就不能直接作为参数,所以又有一种URL安全的Base64编码,就是把字符 + 和 / 分别变成 - 和 _ ,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 是一种把任意二进制数据转换为字符串序列过程

Base64 不能用于真正意义上的数据加密


参考:

https://tools.ietf.org/html/rfc4648

https://en.wikipedia.org

了解一下 - Base64的更多相关文章

  1. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  2. Base64编码

    Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...

  3. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  4. java单向加密算法小结(1)--Base64算法

    从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...

  5. URI编码解码和base64

    概述 对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent. ...

  6. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  7. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  8. android Base64 加密

    一 Base64加密 import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStre ...

  9. When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)

    关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...

  10. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

随机推荐

  1. 神奇的Scala Macro之旅(四)- BeanBuilder

    在Java开发中,经常会有一个需求,将一个 Bean 复制到另外一个 Bean,尤其是在后台分层的场景下,在不同的层之间传递信息,经常需要进行 这样的一个对象复制工作,类似于: val source: ...

  2. 10位时间戳使用moment转化为日期

    前情提要: 需要把后台传过来的10位时间戳转化格式为:‘YYYY-MM-DD HH:mm:ss’的日期展示在页面上.本来是自己写了个函数,但是奈何leader说我们项目用了moment了,你为什么不用 ...

  3. 吴恩达深度学习笔记1-神经网络的编程基础(Basics of Neural Network programming)

    一:二分类(Binary Classification) 逻辑回归是一个用于二分类(binary classification)的算法.在二分类问题中,我们的目标就是习得一个分类器,它以对象的特征向量 ...

  4. docker(5):数据的管理

    Docker的volume卷 为了能持久话保存和共享容器的数据. 使用docker volume卷的两种方式 1:数据卷 2:数据卷容器 1:数据卷 数据卷:数据卷会绕过docker 的ufs 直接写 ...

  5. 2018-09-15 Java源码英翻中库以及服务原型

    服务很简单, 只为演示这个库, 源码在: program-in-chinese/code_translator_service. 在Postman测试效果: 演示服务地址: 74.91.17.250: ...

  6. npm 模块化管理

    我们要使用 npm 进行包管理,首先我们得安装 npm,怎么安装?其实只要你安装了 node,那便相当于安装了 npm: node下载地址:http://nodejs.cn/download/ 由于 ...

  7. Python之路【第五篇】:Python基础之文件处理

    阅读目录 一.文件操作 1.介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操 ...

  8. python全栈目录

    Python Python开发[第一篇]:初识 Python开发[第二篇]:基本数据类型 Python开发[第三篇]:函数 Python开发[第四篇]:杂货铺 Python开发[第五篇]:模块 Pyt ...

  9. python 简史

    ---恢复内容开始--- Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机 ...

  10. 最简单的Nginx讲解--HTTP服务器、正向代理、反向代理、负载均衡

    1. Nginx 1.1 Nginx简介 Nginx是俄罗斯人开发,开源的,免费的. Nginx功能: 1) nginx作为http服务器:类似apache,tomcat,遵循http协议. a) 访 ...