了解一下 - Base64
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的更多相关文章
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- java单向加密算法小结(1)--Base64算法
从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...
- URI编码解码和base64
概述 对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent. ...
- 通过HTML5的Drag and Drop生成拓扑图片Base64信息
HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...
- Base-64 字符数组或字符串的长度无效等问题解决方案
项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...
- android Base64 加密
一 Base64加密 import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStre ...
- When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)
关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
随机推荐
- Eureka的功能特性及相关配置
1.服务提供者1.1服务注册服务提供者启动时,会通过rest请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server接收到请求后,将元数据信息 ...
- 阿里微服务架构下分布式事务解决方案-GTS
虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...
- .Net小白离开校园的第一年
Why? 2018的已经步入尾声,对新的一年又是充满期待. 在这年底里,看到园子里有很多园友写了博客回顾自己的2018,本人自知文笔和各位前辈比不了,但是我也想来写一写,这是我特殊的第一年,记录下来, ...
- Spring Boot 2.x整合Redis
最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...
- 第15章 时间常数字符串比较 - IdentityModel 中文文档(v1.0.0)
在比较安全上下文中的字符串(例如比较键)时,应尽量避免泄漏时序信息. 该TimeConstantComparer类可以帮助: var isEqual = TimeConstantComparer.Is ...
- css控制元素高度自适应
可以采用元素定位 + padding 的方式使特定元素高度自适应. css 样式: html,body{ height:100%; margin:; padding:; } .wrap { heigh ...
- MySQL找不到msvcp140.dll”
没有安装VC++2015(Microsoft Visual C++ 2015 Redistributable), 下载地址 点击download,一个64位的一个32位的.
- Linux 操作系统基础
list : ls 目录: 文件,路径映射. ls : -l : lang 长格式, 显示完整信息. 文件类型: -: 普通文件(f) d: 目录文件 b: 块设备文件(block) c: 字块设备文 ...
- OPPO X9007 升级到Android5.0 Color2.1(root版) 详细纪实
今天要做个测试,而测试APK刚好是要求最低5.0版本,正好手里有个老款手机OPPO X9007,而预装的系统是4.3,试了下虽然也能运行,但是主要功能不正常,毕竟人家APK最低要求摆在那. 反正这个手 ...
- invokedynamic字节码指令
1. 方法引用和invokedynamic invokedynamic是jvm指令集里面最复杂的一条.本文将从高观点的角度下分析invokedynamic指令是如何实现方法引用(Method refe ...