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. 不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用

    在微服务架构中,如果使用得是SpringCloud,那么只需要集成SpringFeign就可以了,SpringFeign可以很友好的帮我们进行服务请求,对象解析等工作. 然而SpingCloud是依赖 ...

  2. Netty实现高性能IOT服务器(Groza)之精尽代码篇中

    运行环境: JDK 8+ Maven 3.0+ Redis 技术栈: SpringBoot 2.0+ Redis (Lettuce客户端,RedisTemplate模板方法) Netty 4.1+ M ...

  3. 死磕 java集合之DelayQueue源码分析

    问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...

  4. 【Python3爬虫】你会怎么评价复仇者联盟4?

    一.写在前面 最近复仇者联盟4正在热映中,很多人都去电影院观看了电影,那么对于这部电影,看过的人都是怎么评价的呢?这时候爬虫就可以派上用场了! 二.主要思路 首先打开豆瓣电影,然后进入复仇者联盟4的详 ...

  5. 第8章 动态客户端注册 - IdentityModel 中文文档(v1.0.0)

    OpenID Connect动态客户端注册的客户端库是作为HttpClient扩展方法提供的. 以下代码发送注册请求: var client = new HttpClient(); var respo ...

  6. python 生成 1900-2100 的二十四节气文件

    [学习笔记] 转载 #!/usr/bin/python3.7# -*- coding:utf-8 -*- '''整体思路1:根据公式算出节气日期 1900 年到 2100  200 年的时间2:特殊的 ...

  7. ["1", "2", "3"].map(parseInt)`返回的结果是[1,2,3]?

    今天刷到一道面试题,["1", "2", "3"].map(parseInt)返回的结果是什么呢?可能大家第一个想到的是 [1,2,3],但 ...

  8. ArcGIS 网络分析[0] 介绍与博文目录【更新中】

    网络分析是个热点,理论上是属于计算机图形学和数据结构的,GIS以此为基础做出应用. 以下列举本人在学习中遇到的网络分析问题与经验总结. 1. 软件平台及数据准备 平台:Windows 10 操作系统, ...

  9. PowerDesigner如何连接数据库--odbc连接数据库用法

    先下载msi   https://dev.mysql.com/downloads/connector/odbc/ 注:如果不成功,有可能msi版本问题,可以更换一下msi 前期准备 双击odbc的ms ...

  10. 判断JS数据类型的四种方法

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined.N ...