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 到 25a–z→ 值 26.510–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?
JWT - 大型
每个 JSON Web 令牌都是三个 Base64URL 编码的段,由点连接:标头、有效负载、签名。调试授权是 50% 解码这些。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
解码第一段,你就得到了 {"alg":"HS256","typ":"JWT"}。第二个给你声称。当一个令牌行为不端时我的工作流程:在点处分裂,解码中的每个部分 Base64 转换器然后将 JSON 粘贴到 json格式化程序 要正确阅读。两种粘贴,你知道是否 exp 索赔是你的问题。
值得简单地说:JWT 有效载荷是 任何持有令牌的人都可以阅读。签名停止篡改,不读取。I've审查了将敏感数据塞进声明中的代码库,因为胡言乱语的外观暗示了隐私。它没有't。

数据 URI
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Embedding小资产内联保存一个HTTP请求我的经验法则从构建图像重WordPress管理员UIs:值得下 ~ 5 KB, 过去10 KB你're膨胀33%的文档保存一个请求HTTP/2复用反正。
Kubernetes 的秘密 - 和咆哮
apiVersion: v1
kind: Secret
data:
password: cGFzc3dvcmQ= # decodes to "password"
Kubernetes 秘密是 Base64 编码的,这意味着虚假的安全性令人震惊。该值在一块粘贴中解码。这里存在 Base64,因此二进制值可以存活 YAML - a 格式化 decision,而不是安全的一个。如果你的秘密故事结束于"他们're Base64在etcd,"它已经't开始。
列表的其余部分
HTTP 基本 Auth 标头 (Authorization: Basic dXNlcjpwYXNz 解码为普通 user:pass- 因此仅 HTTPS)。通过 MIME 发送电子邮件附件。 JSON 有效负载内的二进制 blob,因为 JSON 没有二进制类型。
Base64是加密吗?(请编号,编号)
值得它自己的部分,因为误解拒绝消亡。
Base64 是一个 代表(如用十六进制写一个数字) 没有密钥 没有秘密 解码除了在RFC 4648中公开打印的字母表之外什么都不需要 任何东西 Base64-"保护"通过用草书写来保护字母的方式。
如果数据需要保密:正确加密(AES-GCM 或 libsodium), 然后 Base64-编码密文,如果通道需要文本。编码和加密组成精细 - 他们只是aren't替代品。而如果你需要完整性而不是保密,那's a hash'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''''''''''''''' | JWT、MIME、数据 URI | 哈希值、MAC 地址、颜色代码 | 查询字符串 | PDF 内部 |
我如何选择: 十六进制 当人类读取或比较输出时 - 校验和、摘要、眼球调试的任何内容。 编码百分比 URL文本,从不二进制。 基地64 对于跨文本通道的二进制 - 大多数真实情况。 ASCII85 从来不是自愿的; 8% 的节省尚未证明兼容性问题的合理性。
什么是 URL-Safe Base64 以及为什么存在?
标准 Base64 有问题: + 意思是"空间"在查询字符串中, / 是路径分隔符, = 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 的解码器是'解码器的大部分。
经验法则:如果编码的字符串会触摸 URL、文件名或 HTTP 标头,请从一开始就使用 URL 安全的变体。重新拟合是查找并替换加上祈祷。
您如何在代码中编码和解码?
JavaScript - 我陷入的陷阱
Here'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步骤可以'不要忘记,我希望 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've 曾经工作过,包括 WP Adminify。PHP 从未内置 URL 安全的变体,所以我们都一直写相同的两行。
常见问题
base64 编码是干什么用的?
ASCII文本转换二进制数据,因此它可以通过仅处理文本的系统:JSON有效负载,URL,电子邮件(MIME),HTTP标头。您最常在JWT令牌中遇到它, data: URI内联图像,库伯内特秘密,以及携带文件的API有效载荷。It's一种传输格式,而不是存储或安全格式。
Base64和加密一样吗?
No,而混淆两者造成真实的安全事件,Base64没有密钥- 解码只需要公共字母表,任何一个粘贴都带入一个 解码器。先用真实算法(AES-GCM)加密,如果通道需要文本,则对密文进行编码。
Base64为什么会让数据大33%?
Base64每个字符携带6位信息,但占用完整的8位字节,因此3字节的输入总是变成4个字符的输出- 4/3 ≈ 1.33。It's格式的固定成本,设计无法避免。如果大小很重要,在编码之前压缩,在编码之后永远不会 - 编码输出看起来随机,压缩得很糟糕。
Base64 和 Base64URL 之间的区别是什么's?
Base64URL 交换 + 为 - 並 / 为 _并且通常会掉落 = padding,所以输出在 URL、文件名和标头中保留下来而不会转义。否则相同的算法,定义在 RFC 4648 第 5 节中。JWT 专门使用 Base64URL - 这就是为什么严格的标准-Base64 解码器有时会扼杀它们。
Btoa()为什么会抛出无效的字符错误?
您的字符串包含拉丁语 1 之外的字符 - 表情符号、重音字符、任何非西方文字。 btoa 是 20 世纪 90 年代的 API,早于合理的 Unicode 处理。首先将编码为 UTF-8 字节 TextEncoder,然后是 Base64 字节;我在生产工具中发出了这个确切的错误,所以没有判断。
如何判断字符串是否为 Base64?
有效的 Base64 仅使用 A–Z、 a–z、 0–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),可选尾随 =、长度为 's 填充时为 4 的倍数。但很多普通单词也与该模式匹配 - cafe is valid 解码为垃圾字节的Base64,真正的测试就是解码,检查输出是否有意义。
为什么我的 Base64 字符串末尾有一个杂散换行符?
因为 echo 之前添加一个 base64 曾经看到过,所以 echo "hunter2" | base64 编码八个字节,而不是七个。使用 printf 或 echo -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 解码器- 他们'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,所以翻译 -/_ 回到 +// 首先,如果您're 处理 Base64URL 字符串。
外卖
Base64是一个30年历史的洗位技巧,悄悄地支撑了一半的现代网络- auth令牌,附件,内联资产,秘密-that-aren't-secret 了解6位重整,尊重33%的税收,永远不要误认为加密,在涉及URL的任何地方都触及URL安全的变体。那's 95%的实用Base64掌握。
对于动手部分, Toolz.dev 上的 Base64 转换器 完全在浏览器中进行标准和 URL 安全编码 - 由以艰难方式学习 Unicode 课程的人构建,因此您不'不必这样做。
本系列中的更多内容:完整 编码工具指南 涵盖其余的日常驾驶员公用事业 regex 构建器指南 解决其他技能开发人员假装拥有的问题,由于 Base64 调试的一半在 JSON 中结束 终极 JSON 工具指南 是自然的下一个阅读。
相关文章:



