Skip to content

Base64 编码

TIP

不算加密,一种编码方式,应用的场景还挺多的🤔

简介

Base64的核心目标是将二进制数据转换为纯文本,以便在仅支持文本的环境中处理二进制内容。以下是其典型应用场景:

  1. 电子邮件传输 早期电子邮件协议仅支持ASCII文本,通过Base64编码可将附件(如图片、文档)转为文本传输。
  2. 网页资源内嵌 将小图片转为Base64字符串嵌入HTML/CSS,减少HTTP请求,提升加载速度(需权衡文件大小)。
  3. API数据传输 在JSON或XML中安全传输二进制数据(如加密后的密钥)。
  4. URL与Cookie安全 URL安全的Base64变体可用于传递参数,避免特殊字符冲突。

编码原理

基本规则

  • 字符集:包含 A-Za-z0-9+/ 共64个字符,= 用于填充。
  • 转换流程
    1. 将二进制数据按每3字节(24bit) 分组。
    2. 每组拆分为4个6bit片段,每个片段转为十进制数。
    3. 查Base64索引表,将十进制数转为对应字符。

编码过程

如下图所示

mermaid
graph LR
    Start([开始]) --> Input[输入: Man]
    Input --> Hex[Hex: 4D 61 6E]
    Hex --> Bin[24位二进制<br/>01001101 01100001 01101110]
    Bin --> Split[重分为4组6位<br/>010011 010110 000101 101110]
    Split --> Dec[十进制索引<br/>19 &nbsp; 22 &nbsp; 5 &nbsp; 46]
    Dec --> Map[查表映射<br/>T &nbsp; W &nbsp; F &nbsp; u]
    Map --> Result([输出: TWFu])

    style Start fill:#e1f5fe,stroke:#01579b
    style Result fill:#c8e6c9,stroke:#2e7d32
    style Split fill:#fff9c4,stroke:#fbc02d

填充规则

  • 若二进制数据不足3字节倍数,末尾补0x00,编码后添加=表示填充:
    • 补1字节 → 加1个=
    • 补2字节 → 加2个=

编码效率

  • 缺点:编码后数据体积增加约33%(3字节→4字符)。
  • 适用场景:小文件或文本协议传输,避免大文件使用。

变体与安全性

URL安全变体

  • 问题:标准Base64中的+/在URL中需转义。
  • 解决方案:使用-代替+_代替/,并省略填充符=(可选)。

常见同类

这些是与 Base64 同类的编码方案,但使用不同的字符集大小,因此不是 Base64 的变体。

  • Base32

    • 字符集:32 个字符(通常是 A-Z 去掉易混淆的 0, 1, 8 等,或使用 A-Z2-7)。

    • 特点:比 Base64 更长,但容错性更好(减少字符混淆,如 0 和 O),且不包含特殊符号。

    • 用途:一次性密码(TOTP/HOTP)、短码、需要高可读性的场景。

  • Base16 (Hexadecimal, 十六进制)

    • 字符集:16 个字符(0-9, A-Fa-f)。

    • 特点:编码后数据体积是原始数据的两倍(每字节转为两个字符),但最简单、最通用,无任何特殊字符。

    • 用途:颜色代码、校验和(如 MD5, SHA-1)、底层数据表示。

  • Base62

    • 字符集:62 个字符(0-9, A-Z, a-z),不包含 +, /, = 等符号。

    • 特点:生成的字符串仅包含字母和数字,非常适合生成短链接、数据库 ID。

    • 注意:Base62 是一个独立的编码,因为其字符集更小(62 vs 64),且设计目标是纯字母数字。

参考三三

如有转载或 CV 请标注本站原文地址