Command Palette

Search for a command to run...

Base64 编码解释:像专业版一样编码和解码

Base64 编码解释:像专业版一样编码和解码

T
Toolz Team
|Jun 18, 2026|15 最小读数

编码 合集的一部分

Base64转换器的第一个版本我发货在toolz。dev上有一个bug I'm仍然有点尴尬,它在我写的每个测试中都完美工作 - 编码,解码,往返,完成然后有人粘贴了包含表情符号的文本,并得到了这个:

Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.

I'd搭建了一个文本编码工具,忘记了文本包括,你知道, 大多数文本。每一个非拉丁文字,每一个重音字符,每一个表情符号- 坏了。我的测试都是ASCII,因为我认为在ASCII。那个错误教会了我更多关于Base64的知识,而不是任何规范阅读,而I'稍后会向您展示修复方法,因为它几乎会绊倒所有触摸的人 btoa()

Base64是开发人员日常使用的东西之一 - 在每个JWT内部,每个电子邮件附件,每个 data: URI-而很少看在引擎盖下。让's看在引擎盖下。

TL;博士: Base64编码将二进制数据转换为64个安全的ASCII字符,因此它可以通过JSON,URL和电子邮件等纯文本渠道进行传输-成本约为33%的大小开销,它是 不是 加密;任何人都可以立即反转。要立即编码或解码,请使用免费客户端 Base64 转换器 toolz。dev上 - 您的数据永远不会离开浏览器,这在您'重新解码令牌时很重要。


什么是 Base64 编码?

Base64是一种二进制到文本的编码方案:它表示任意字节,只使用64个字符,这些字符在有史以来构建的每个文本系统中都存活下来,权威的规范是 RFC 4648 (2006),尽管编码可以追溯到 1993 年的 RFC 1421 和隐私增强邮件 - Base64 比 Web 浏览器更古老。

字母表:

  • A–Z → 值 0 到 25
  • a–z → 值 26.51
  • 0–9 → 值 52,61
  • + → 62, / → 63
  • = → 填充(不是一个值,只是填充物)

64个为什么?因为它们在ASCII、EBCDIC和每一个曾经建立的电子邮件网关中都毫发无伤地生存下来。Base64是一个和平条约,拥有数十年的纯文本基础设施。

条约的成本:每 3 个输入字节变成 4 个输出字符 - 固定的 33% 大小税。将该数字保留在您的脑海中;它决定真正的架构问题。


Base64算法是如何工作的?

比你更短的答案'd预期:将8s的位重新组合成6s,然后在表格中查找它们。26 = 64 - that's名称的来源。

编码 Hi!:

步骤 1 - 字节到位。

角色 ASCII 二进制
H 72绔 涔诲芥澶澧 01001000
ii 105绔 涔诲芥澶澧 01101001
! 33绔 涔诲芥澶澧 00100001

串联: 010010000110100100100001- 24 位。

2步 - 重新组合成6位块。

010010 | 000110 | 100100 | 100001
  18   |   6    |   36   |   33

3步 - 查找字母表中的每个值。

18 → S,6 → G,36 → k,33 → h.所以 Hi! 编码为 SGkh

That's整个算法。查找表之外没有数学。

填充 处理 aren't 3 字节倍数的输入。仅编码 Hi (2字节 = 16位),并且只能填充两个和一位6位组;编码器将位和附加进行零填充 = 表明填充物含量:

Hi  → SGk=    (2 bytes remaining → one '=')
H   → SA==    (1 byte remaining  → two '==')
Hi! → SGkh    (multiple of 3     → no padding)

Toolz。dev转换器实现这一点时,填充是我所有一个错误都存在的地方如果你曾经手卷Base64 - 对于编码面试,比如说 - 首先写填充测试。

解码是镜像:字符返回到 6 位值,重新组合成 8 位字节,丢弃填充。

Base64 encoding process diagram showing binary conversion, 6-bit grouping, and character mapping


您实际上在哪里运行到 Base64?

JWT - 大型

每个 JSON Web 令牌都是三个 Base64URL 编码的段,由点连接:标头、有效负载、签名。调试授权是 50% 解码这些。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

解码第一段,你就得到了 {"alg":"HS256","typ":"JWT"}。第二个给你声称。当一个令牌行为不端时我的工作流程:在点处分裂,解码中的每个部分 Base64 转换器然后将 JSON 粘贴到 json格式化程序 要正确阅读。两种粘贴,你知道是否 exp 索赔是你的问题。

值得简单地说:JWT 有效载荷是 任何持有令牌的人都可以阅读。签名停止篡改,不读取。I've审查了将敏感数据塞进声明中的代码库,因为胡言乱语的外观暗示了隐私。它没有't。

JWT being decoded with Base64 converter showing header, payload, and signature parts

数据 URI

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

Embedding小资产内联保存一个HTTP请求我的经验法则从构建图像重WordPress管理员UIs:值得下 ~ 5 KB, 过去10 KB你&#39;re膨胀33%的文档保存一个请求HTTP/2复用反正。

Kubernetes 的秘密 - 和咆哮

apiVersion: v1
kind: Secret
data:
  password: cGFzc3dvcmQ=   # decodes to "password"

Kubernetes 秘密是 Base64 编码的,这意味着虚假的安全性令人震惊。该值在一块粘贴中解码。这里存在 Base64,因此二进制值可以存活 YAML - a 格式化 decision,而不是安全的一个。如果你的秘密故事结束于&quot;他们&#39;re Base64在etcd,&quot;它已经&#39;t开始。

列表的其余部分

HTTP 基本 Auth 标头 (Authorization: Basic dXNlcjpwYXNz 解码为普通 user:pass- 因此仅 HTTPS)。通过 MIME 发送电子邮件附件。 JSON 有效负载内的二进制 blob,因为 JSON 没有二进制类型。


Base64是加密吗?(请编号,编号)

值得它自己的部分,因为误解拒绝消亡。

Base64 是一个 代表(如用十六进制写一个数字) 没有密钥 没有秘密 解码除了在RFC 4648中公开打印的字母表之外什么都不需要 任何东西 Base64-&quot;保护&quot;通过用草书写来保护字母的方式。

如果数据需要保密:正确加密(AES-GCM 或 libsodium), 然后 Base64-编码密文,如果通道需要文本。编码和加密组成精细 - 他们只是aren&#39;t替代品。而如果你需要完整性而不是保密,那&#39;s a hash&#39;s job - the 哈希发生器 涵盖 SHA-256 和朋友。


Base64 如何与 Hex、URL 编码和 Base85 进行比较?

基地64 六角形(Base16) URL/编码百分比 ASCII85
尺寸开销 +33% +100% 0,200%,含量依赖性 +25%
字母表 64个字符 16个字符 ASCII+ %XX 逃脱 85个字符
人类可读的输出 某种字节边界可见 主要是为了ASCII输入
默认情况下 URL 安全 没有(+/=) 是的 是的,根据定义
You&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39; JWT、MIME、数据 URI 哈希值、MAC 地址、颜色代码 查询字符串 PDF 内部

我如何选择: 十六进制 当人类读取或比较输出时 - 校验和、摘要、眼球调试的任何内容。 编码百分比 URL文本,从不二进制。 基地64 对于跨文本通道的二进制 - 大多数真实情况。 ASCII85 从来不是自愿的; 8% 的节省尚未证明兼容性问题的合理性。


什么是 URL-Safe Base64 以及为什么存在?

标准 Base64 有问题: + 意思是&quot;空间&quot;在查询字符串中, / 是路径分隔符, = delimits参数。url和一些中间件中放一个标准-base64令牌, 某处,会破坏它-间歇性地, 而且只在生产中问我怎么知道。

RFC 4648 第 5 节定义了修复程序,通常称为 Base64URL:

标准 URL-安全的
+ -
/ _
= 填充 通常只是省略

相同的算法,两个字符交换,填充丢弃。 JWT 专门使用 Base64URL - 这正是为什么将 JWT 段粘贴到严格的标准中 - Base64 解码器有时会在杂散时失败 -_. X = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 10 Toolz.dev 转换器 处理这两种变体,因为拒绝一半现实世界 Base64 的解码器是&#39;解码器的大部分。

经验法则:如果编码的字符串会触摸 URL、文件名或 HTTP 标头,请从一开始就使用 URL 安全的变体。重新拟合是查找并替换加上祈祷。


您如何在代码中编码和解码?

JavaScript - 我陷入的陷阱

Here&#39;s 天真的版本, 我寄出的那个:

btoa('Hello')      // "SGVsbG8=" — great!
btoa('café ☕')    // InvalidCharacterError — the bug from my intro

btoa unicode处理早于现代,只接受拉丁-1。正确的现代方法明确地通过utf-8字节:

// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes));   // "Y2Fmw6kg4piV"

// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
  Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"

(在 Node。js 中, 跳过仪式: Buffer.from(str, 'utf8').toString('base64').)

Python

import base64

encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')

# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')

Python使正确的事情变得显而易见:你 必须 pass字节,所以编码到utf-8步骤可以&#39;不要忘记,我希望 btoa 已经设计了相同的脊柱。

PHP

$encoded = base64_encode('café ☕');   // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);

// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');

那个 strtr/rtrim line 已经出现在每一个 PHP 代码库 I&#39;ve 曾经工作过,包括 WP Adminify。PHP 从未内置 URL 安全的变体,所以我们都一直写相同的两行。


常见问题

base64 编码是干什么用的?

ASCII文本转换二进制数据,因此它可以通过仅处理文本的系统:JSON有效负载,URL,电子邮件(MIME),HTTP标头。您最常在JWT令牌中遇到它, data: URI内联图像,库伯内特秘密,以及携带文件的API有效载荷。It&#39;s一种传输格式,而不是存储或安全格式。

Base64和加密一样吗?

No,而混淆两者造成真实的安全事件,Base64没有密钥- 解码只需要公共字母表,任何一个粘贴都带入一个 解码器。先用真实算法(AES-GCM)加密,如果通道需要文本,则对密文进行编码。

Base64为什么会让数据大33%?

Base64每个字符携带6位信息,但占用完整的8位字节,因此3字节的输入总是变成4个字符的输出- 4/3 ≈ 1.33。It&#39;s格式的固定成本,设计无法避免。如果大小很重要,在编码之前压缩,在编码之后永远不会 - 编码输出看起来随机,压缩得很糟糕。

Base64 和 Base64URL 之间的区别是什么&#39;s?

Base64URL 交换 +-/_并且通常会掉落 = padding,所以输出在 URL、文件名和标头中保留下来而不会转义。否则相同的算法,定义在 RFC 4648 第 5 节中。JWT 专门使用 Base64URL - 这就是为什么严格的标准-Base64 解码器有时会扼杀它们。

Btoa()为什么会抛出无效的字符错误?

您的字符串包含拉丁语 1 之外的字符 - 表情符号、重音字符、任何非西方文字。 btoa 是 20 世纪 90 年代的 API,早于合理的 Unicode 处理。首先将编码为 UTF-8 字节 TextEncoder,然后是 Base64 字节;我在生产工具中发出了这个确切的错误,所以没有判断。

如何判断字符串是否为 Base64?

有效的 Base64 仅使用 A–Za–z0–9+/ (或x),在2019年1月17日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日 -_ 为URL-safe),可选尾随 =、长度为 &#39;s 填充时为 4 的倍数。但很多普通单词也与该模式匹配 - cafe is valid 解码为垃圾字节的Base64,真正的测试就是解码,检查输出是否有意义。

为什么我的 Base64 字符串末尾有一个杂散换行符?

因为 echo 之前添加一个 base64 曾经看到过,所以 echo "hunter2" | base64 编码八个字节,而不是七个。使用 printfecho -n 相反。这是 Kubernetes Secrets 的头号原因,它在清单中看起来很正确,但在运行时会失败:解码的密码带有不可见的尾随 \n. X = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 10 base64 command 还在某些系统上将输出包裹在 76 列 - pass -w 0 GNU 核心利用来抑制它。

如何手工解码 JWT 令牌?

将令牌分割在其两个点处,取第一个段(标头)和第二段(有效负载),并各自运行 a Base64 解码器- 他们&#39;re Base64URL,所以使用一个接受的工具 -_.然后将得到的 JSON 格式化为 a JSON 格式化程序 read the claims。永远不要将生产令牌粘贴到服务器端工具中;仅限客户端。

如何将图像或文件编码为 Base64?

以字节形式读取文件,然后以这些字节为基础64并像这样预先添加数据URI标头 data:image/png;base64, 所以浏览器可以内联渲染。在 JavaScript 中, FileReader.readAsDataURL() 为您执行这两个步骤;在命令行上, base64 logo.png 打印原始编码。将其保留为小型资产 - 33% 的尺寸税使 Base64 不适合任何大型产品,并且大数据 URI 会使您的 HTML 或 CSS 膨胀。

如何在 JavaScript、Python 或终端中解码 Base64?

在现代 JavaScript 中,使用 Unicode 安全地解码 new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) 而不是裸露 atob.在 Python 中, base64.b64decode(str) 返回字节 - 调用 .decode('utf-8') 为文本。在终端中, echo "aGk=" | base64 -d (或x),在2019年1月17日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日,在2019年1月1日 --decode)。三者都期望标准Base64,所以翻译 -/_ 回到 +// 首先,如果您&#39;re 处理 Base64URL 字符串。


外卖

Base64是一个30年历史的洗位技巧,悄悄地支撑了一半的现代网络- auth令牌,附件,内联资产,秘密-that-aren&#39;t-secret 了解6位重整,尊重33%的税收,永远不要误认为加密,在涉及URL的任何地方都触及URL安全的变体。那&#39;s 95%的实用Base64掌握。

对于动手部分, Toolz.dev 上的 Base64 转换器 完全在浏览器中进行标准和 URL 安全编码 - 由以艰难方式学习 Unicode 课程的人构建,因此您不&#39;不必这样做。

本系列中的更多内容:完整 编码工具指南 涵盖其余的日常驾驶员公用事业 regex 构建器指南 解决其他技能开发人员假装拥有的问题,由于 Base64 调试的一半在 JSON 中结束 终极 JSON 工具指南 是自然的下一个阅读。


相关文章:

Frequently Asked Questions

It converts binary data into ASCII text so it can pass through systems that only handle text: JSON payloads, URLs, email (MIME), HTTP headers. You meet it most often in JWT tokens, data: URIs for inline images, Kubernetes Secrets, and API payloads carrying files. It's a transport format, not a storage or security format.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!