Base64 编码:原理、应用与 Java 实现
Base64 是一种基于 64 个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据的编码方式,它的核心作用是将二进制数据转换为文本格式,以便在仅支持文本传输的场景中安全传递(如 URL、邮件、XML 等)。
Base64 编码的核心原理
编码规则
- 字符集:使用 64 个固定字符,对应值为 0-63:
- A-Z(26 个):对应 0-25
- a-z(26 个):对应 26-51
- 0-9(10 个):对应 52-61
+:对应 62,/:对应 63
- 填充符:当二进制数据长度不是 3 的倍数时,用
=填充(最多 2 个),确保编码后长度为 4 的倍数。
编码过程(以 3 字节数据为例)
- 将 3 字节二进制数据(共 24 位)拆分为 4 个 6 位分组(24 ÷ 6 = 4)。
- 每个 6 位分组对应 Base64 字符集中的一个字符(0-63)。
- 若数据长度不足 3 字节,剩余位数用 0 填充,并用
=补足 4 个字符。
示例:编码字符串"AB"(2 字节)
- 二进制:
01000001 01000010(16 位) - 拆分为 3 个 6 位分组 + 剩余 4 位补 0:
010000 010100 001000 000000 - 对应值:16、20、8、0 → 字符:
QUJDAA==(最后两位用=填充)。
Base64 的应用场景
Base64 编码并非加密算法(编码过程可逆),主要用于二进制数据的文本化转换,典型场景包括:
- 数据传输:在仅支持文本的协议中传输二进制数据(如 HTTP 请求体、邮件附件)。
- 数据存储:将二进制数据(如图片、文件)以字符串形式存储(如数据库字段、配置文件)。
- URL 安全:部分场景使用
-和_替代+和/(避免 URL 特殊字符冲突),称为 Base64URL 编码。
Java 中的 Base64 编解码实现
Java 中常用的 Base64 工具类有两种:
- Apache Commons Codec:第三方库(
org.apache.commons.codec.binary.Base64)。 - Java 8 内置:
java.util.Base64(推荐,无需额外依赖)。
1. Apache Commons Codec 实现(示例代码)
需引入依赖:
1 | <dependency> |
编码与解码代码:
1 | import org.apache.commons.codec.binary.Base64; |
2. Java 8 内置 Base64 实现
1 | import java.nio.charset.StandardCharsets; |
Base64 的局限性
- 数据膨胀:编码后数据长度约为原数据的 1.33 倍(3 字节→4 字节),会增加传输 / 存储成本。
- 非加密性:Base64 是编码而非加密,任何人都可解码,不可用于保护敏感数据(需配合加密算法)。
v1.3.10