Base64 编码
TIP
不算加密,一种编码方式,应用的场景还挺多的🤔
简介
Base64的核心目标是将二进制数据转换为纯文本,以便在仅支持文本的环境中处理二进制内容。以下是其典型应用场景:
- 电子邮件传输 早期电子邮件协议仅支持ASCII文本,通过Base64编码可将附件(如图片、文档)转为文本传输。
- 网页资源内嵌 将小图片转为Base64字符串嵌入HTML/CSS,减少HTTP请求,提升加载速度(需权衡文件大小)。
- API数据传输 在JSON或XML中安全传输二进制数据(如加密后的密钥)。
- URL与Cookie安全 URL安全的Base64变体可用于传递参数,避免特殊字符冲突。
编码原理
基本规则
- 字符集:包含
A-Z、a-z、0-9、+、/共64个字符,=用于填充。 - 转换流程:
- 将二进制数据按每3字节(24bit) 分组。
- 每组拆分为4个6bit片段,每个片段转为十进制数。
- 查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 22 5 46]
Dec --> Map[查表映射<br/>T W F 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个
=
- 补1字节 → 加1个
编码效率
- 缺点:编码后数据体积增加约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-F或a-f)。特点:编码后数据体积是原始数据的两倍(每字节转为两个字符),但最简单、最通用,无任何特殊字符。
用途:颜色代码、校验和(如 MD5, SHA-1)、底层数据表示。
Base62
字符集:62 个字符(
0-9,A-Z,a-z),不包含+,/,=等符号。特点:生成的字符串仅包含字母和数字,非常适合生成短链接、数据库 ID。
注意:Base62 是一个独立的编码,因为其字符集更小(62 vs 64),且设计目标是纯字母数字。
