java中Base64编码原理实例讲解

时间:2022-10-07 08:55:00

什么是 Base64 编码

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

使用场景

数据加密或签名通过 Base64 转换为字符串存储或传输。
不能传输文件的网络环境可以转换 Base64 进行网络传输。
在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源。
在 URL、网页中传输少量二进制数据等等。

Base64 编码原理

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

Base64 标准编码表:

java中Base64编码原理实例讲解

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

java中Base64编码原理实例讲解

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

java中Base64编码原理实例讲解
java中Base64编码原理实例讲解

经过 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 开头的类(www.oracle.com/technetwork/java/faq-sun-packages-142232.html)。

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

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

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

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

小结

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

到此这篇关于java中Base64编码原理实例讲解的文章就介绍到这了,更多相关java中base64编码原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/newobjectcc/p/14391876.html