正在加载,请稍候…

Base64 编码详解:定义、用法与适用场景

了解 Base64 编码是什么,如何对字符串和文件进行编码和解码,何时使用(以及何时不使用),以及它与十六进制和二进制编码的比较。

Base64 编码详解:定义、用法与适用场景

什么是 Base64 编码?

Base64 是一种二进制到文本的编码方案,它使用 64 个可打印的 ASCII 字符来表示二进制数据。名称 "Base64" 源于其基数为 64 的表示法。使用的 64 个字符是:A-Z(26 个)、a-z(26 个)、0-9(10 个)、+ 和 /(2 个),并用 = 作为填充。

Base64 旨在通过设计用于处理文本的通道(如电子邮件 SMTP)安全地传输二进制数据,或将二进制内容嵌入 XML 或 JSON 中。

Base64 编码详解:定义、用法与适用场景 插图

Base64 编码的工作原理

Base64 每次取 3 个字节(24 位)输入,生成 4 个字符输出。每个输出字符代表输入数据的 6 位。

输入字节:    01001101  01100001  01101110
分组为 6 位: 010011  010110  000101  101110
Base64 索引: 19      22      5       46
Base64 字符: T       W       F       u

编码后大小增加约 33%(每 3 个字节变成 4 个字符)。如果输入不能被 3 整除,则添加 = 填充。

Base64 编码示例

输入:    "Hello"
Base64:   SGVsbG8=

输入:    "Man"
Base64:   TWFu

输入:    "Ma"  (需要填充)
Base64:   TWE=

Base64 的常见用途

HTTP 基本认证

HTTP Basic Auth 将凭据编码为 username:password 的 Base64 形式:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

这种编码很容易逆向,如果没有 HTTPS 则不提供任何安全性。

Base64 编码详解:定义、用法与适用场景 插图

数据 URI

无需单独的 HTTP 请求即可将图像直接嵌入 HTML:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..." />

JWT 令牌

JSON Web Token 将其头部和负载编码为 Base64URL(Base64 的 URL 安全变体)。

电子邮件附件(MIME)

MIME 编码使用 Base64 将二进制文件(图像、PDF、可执行文件)附加到电子邮件中。

SSH 公钥

SSH 公钥以 Base64 格式存储和传输。

Base64 编码详解:定义、用法与适用场景 插图

Base64 与 Base64URL

标准 Base64 使用 +/,这些在 URL 中是特殊字符。Base64URL 将其替换为:

  • + 变为 -
  • / 变为 _
  • 移除 = 填充

当编码后的字符串将出现在 URL、文件名或 HTTP 头中时,请使用 Base64URL。

Base64 不是加密

这是最常见的误解。Base64 无需任何密钥即可轻松逆向:

atob('SGVsbG8=') // "Hello"

任何看到 Base64 编码数据的人都可以立即解码。切勿使用 Base64 来隐藏密码、API 密钥或敏感信息。

大小开销

Base64 编码会使数据大小增加约 33%:

  • 100 字节变为约 136 个 Base64 字符
  • 1 MB 图像变为约 1.37 MB 的 Base64 字符串

在代码中解码 Base64

// 浏览器
const decoded = atob('SGVsbG8=');  // "Hello"
const encoded = btoa('Hello');     // "SGVsbG8="

// Node.js
Buffer.from('SGVsbG8=', 'base64').toString('utf8')  // "Hello"
Buffer.from('Hello').toString('base64')              // "SGVsbG8="
import base64
base64.b64decode('SGVsbG8=').decode()   # "Hello"
base64.b64encode(b'Hello').decode()     # "SGVsbG8="

何时使用 Base64

在将二进制数据嵌入文本格式(HTML、CSS、JSON、XML)时,通过文本协议传输二进制数据时,或编码必须经受文本转换的二进制数据时,使用 Base64。

当需要安全性(它不提供任何安全性)、大小效率重要(它增加 33% 开销)或数据已经是文本时,不要使用 Base64。

-> 尝试 Base64 字符串转换器