zoukankan      html  css  js  c++  java
  • Base64 编码原理

    什么是 Base64 编码

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

    使用场景

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

    Base64 编码原理

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

    Base64 标准编码表:

    01

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

    02

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

    03
    04

    经过 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

    作者:陆十三
    转载请在明显位置注明出处!
  • 相关阅读:
    关于python的open函数encoding的入参
    控制台输出的log加颜色
    logging把log写到控制台
    合并两个list里的字典
    关于字典数组和元组合并
    python字典做入参调用时要写成**K这种形式
    python在循环中将含变量的字典加到列表中(问题:如果写法不当,会导致最后赋值的变量覆盖列表中前面赋值的变量)
    给定列表,按照列表内容获取excel指定列名下的内容
    selenum报错element is not attached to the page document
    python selenium获取input输入框中的值
  • 原文地址:https://www.cnblogs.com/newobjectcc/p/14391876.html
Copyright © 2011-2022 走看看