什么是Base64,为什么它总是出现
代码里那些奇怪的文本字符串不是乱码。了解Base64编码的工作原理、常见应用场景,以及如何在API调试和数据传输中正确使用它。
你在调试一个API。响应里的某个地方,你看到这个:
SGVsbG8gV29ybGQh
或者你在查看邮件的原始源码,发现大块看起来像键盘乱敲的文本。或者你的CSS里有个背景图片以data:image/png;base64,开头,后面跟着一堵字符墙。
那就是Base64。一旦你开始留意,它无处不在。
Base64到底是什么
二进制数据——图片、文件、任何不是纯文本的东西——跟专为文本设计的系统玩不到一起。电子邮件是为ASCII字符构建的。URL有字符集限制。JSON处理不了原始二进制。
Base64把二进制数据转换成由64个"安全"字符组成的字符串:A-Z、a-z、0-9、+和/。任何二进制文件都变成了一个文本字符串,传递给纯文本系统时不会出错。
它不是加密。不是压缩。只是编码——用另一种方式表示相同的数据。
你会在哪里看到它
邮件附件。 当你通过邮件发送PDF时,它会被Base64编码,作为文本传输,然后在另一端解码。
Data URI。 那个data:image/png;base64,...语法直接在HTML或CSS中嵌入图片。不需要单独的文件请求。
API认证。 基本认证将username:password作为Base64字符串发送。(这就是为什么HTTP上的基本认证不安全——Base64不是加密。)
JWT。 JSON Web Token是三个用点连接的Base64编码的JSON对象。
JSON中的二进制数据。 JSON不能包含原始字节,所以二进制先被Base64编码。
编码 vs 加密
人们总是搞混这两个。
Base64编码: 任何人都能逆向。不需要密钥。不安全。只是重新格式化。
加密: 只能用正确的密钥逆向。真正安全。
如果你不需要密码就能解码,那就不是加密。Base64只能"隐藏"数据不让那些不知道Base64是什么的人看到——而真正想读它的人都知道。
别把密码存成Base64。别假设API里的Base64数据是私密的。它只是看起来奇怪的文本。
大小问题
Base64会使数据大小增加约33%。一个100KB的图片Base64编码后变成~133KB。
这对data URI很重要。在CSS中把大图片嵌入为Base64会让文件更大,而且不能单独缓存。适合小图标。不适合首屏大图。
实际用途
调试。 在API响应中看到Base64?解码它看看里面是什么。
嵌入小图片。 1-2KB以下的图标通常值得嵌入为data URI,以节省HTTP请求。
通过文本通道传递二进制。 需要在JSON中包含文件内容?Base64编码它们。
读取JWT。 解码每个部分以查看header、payload,了解token包含哪些声明。
Base64不复杂。它只是把任何数据变成文本字符串的一种方法。认识它,需要时解码,并且知道它不提供任何安全性——只是兼容性。