# Base64 编码详解：标准、URL 安全与使用场景

> Base64 全面指南——工作原理、标准与 URL 安全变体、在 JWT 和证书中的应用，以及常见错误。

Canonical: https://hsmkit.com/zh/guides/base64-encoding-guide/

Last updated: 2026-04-03

Base64 是计算机领域最常见的编码之一——您在电子邮件、JWT、证书和 API 响应中随处可见它。本文解释 Base64 的工作原理、使用场景以及您会遇到的各种变体。

## 什么是 Base64？

Base64 是一种将二进制数据表示为仅使用 64 个可打印 ASCII 字符的二进制转文本编码方案。当您需要通过只处理文本的系统传输二进制数据时，就会用到它。

使用的 64 个字符：
- `A-Z`（26 个字符）
- `a-z`（26 个字符）
- `0-9`（10 个字符）
- `+` 和 `/`（2 个字符）
- `=` 用于填充

## Base64 工作原理

Base64 将每 3 字节（24 位）二进制数据转换为 4 个字符（每个表示 6 位）：

```
二进制:  01001101 01100001 01101110
分组:    010011 010110 000101 101110
十进制:  19     22     5      46
Base64:  T      W      F      u
```

### 填充
如果输入长度不是 3 的倍数，会添加 `=` 填充字符：
- 剩余 1 字节 → 2 个 Base64 字符 + `==`
- 剩余 2 字节 → 3 个 Base64 字符 + `=`

### 大小开销
Base64 使数据大小增加约 **33%**（3 字节 → 4 字符）。

## Base64 变体

### 标准 Base64（RFC 4648）
- 使用 `+` 和 `/`
- 用 `=` 填充
- 用于：MIME 电子邮件、PEM 证书、大多数通用场景

### URL 安全 Base64（Base64url）
- 使用 `-` 和 `_` 替代 `+` 和 `/`
- 填充可选（通常省略）
- 用于：**JWT 令牌**、URL、文件名、Web API

### MIME Base64
- 标准 Base64，每 76 个字符换行
- 用于电子邮件附件

## Base64 的常见用途

### 证书和密钥（PEM 格式）
每个 PEM 文件都是 Base64 编码的 DER：
```
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiI...
-----END CERTIFICATE-----
```
解码此内容可获得原始 DER 字节，然后用 [ASN.1 解析器](/asn1-parser) 解析。

### JWT 令牌
JSON Web Token 对每个部分使用 Base64url 编码：
```
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSJ9.signature
  ↑ 头部（Base64url）  ↑ 载荷（Base64url）   ↑ 签名
```

### API 响应
许多 API 以 Base64 字符串返回二进制数据（图片、文件、密码学值）。

### 密码学值
配置文件和 API 中的密钥材料、IV、密文通常以 Base64 传输。

## Base64 与其他编码对比

| 编码 | 字符集 | 大小开销 | 使用场景 |
|------|--------|---------|---------|
| 十六进制 | 0-9, A-F | 100% | 密码学值、调试 |
| Base64 | 64 个字符 | 33% | 文本系统中的二进制数据 |
| Base64url | 64 个 URL 安全字符 | 33% | URL、JWT |
| Base94 | 94 个可打印字符 | ~22% | 最大密度文本编码 |

如需最大密度，Base94 使用所有 94 个可打印 ASCII 字符。参见 [Base94 编码器](/base94)。

## 密码学数据中的十六进制 vs Base64

在支付和 HSM 场景中，您会遇到两种格式：

| 格式 | 示例（AES 密钥） | 长度 |
|------|----------------|------|
| 十六进制 | `0123456789ABCDEF0123456789ABCDEF` | 32 字符 |
| Base64 | `ASNFZ4mrze8BI0VniavN7w==` | 24 字符 |

- **十六进制**在 HSM 工具和支付系统中更常见
- **Base64**在 Web/API 场景和证书中更常见

[字符编码转换器](/character-encoding) 可在十六进制、Base64、ASCII、二进制和 EBCDIC 之间转换。

## 实践：解码 Base64

### 检查 JWT
对于 JWT `eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSJ9.xxx`：
1. 用 `.` 分割得到 3 部分
2. Base64url 解码每部分（必要时添加填充）
3. 头部和载荷是 JSON；签名是二进制

### 检查证书
1. 删除 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----`
2. Base64 解码内容得到 DER 字节
3. 用 [ASN.1 解析器](/asn1-parser) 或 [SSL 证书解析器](/ssl-certificates) 解析

### 从 PEM 提取密钥
1. 删除页眉/页脚行
2. Base64 解码得到 DER
3. 用 [RSA DER 公钥解码器](/rsa-der-public-key) 解析

## 常见错误

| 错误 | 问题 | 修复方案 |
|------|------|---------|
| 在 URL 中使用标准 Base64 | `+` 和 `/` 破坏 URL | 使用 Base64url |
| 忘记填充 | 解码失败 | 添加 `=` 填充使长度为 4 的倍数 |
| 将 Base64 与加密混淆 | Base64 不是加密 | 使用 AES 进行真正的加密 |
| 重复编码 | 数据损坏 | 只编码一次 |

**重要**：Base64 是编码，不是加密。任何人都可以解码它。永远不要用 Base64 来"隐藏"敏感数据。

## 在线工具

使用 [Base64 编码器/解码器](/base64)：

- 将文本或十六进制编码为 Base64
- 将 Base64 解码为文本或十六进制
- 处理标准和 URL 安全变体
- 自动处理填充

如需在多种格式（十六进制、Base64、ASCII、二进制、EBCDIC）之间转换，使用 [字符编码转换器](/character-encoding)。
