Base64 不是加密——别再把它当加密用了
不,把你的密码转成 Base64 并不会让它变得安全。让我解释为什么这个误解需要被消除——尽量少吼。
前几天我在一个论坛上看到有人说:"我把所有 API 密钥都用 Base64 加密后再存储。"
我发出了一声。不是人类的声音。是一个开发者刚刚咬到自己舌头的声音。
Base64 是一层油漆,不是保险柜
让我直说了吧。Base64 不是加密。它甚至算不上混淆。它是编码。它相当于用草书写"pizza"然后称之为秘密。如果我把 cGl6emE= 给你,你把它粘贴到我们的 Base64 decoder 里,你大约在 0.3 秒内得到"pizza"。恭喜你,破案了,夏洛克。
一条经验法则:如果有一个公开工具可以立即逆转你刚刚做的事情,那就不算安全措施。加密需要密钥。Base64 使用查表法。两者完全不同。
现代版的 ROT13
我认为人们会盯上 Base64 是因为它看起来像加密。末尾的等号!随机的字母!加号!感觉像是一个秘密代码。公平地说,对于从未见过它的人来说,dGhpcyBpcyBub3QgZW5jcnlwdGlvbg== 看起来确实像外星语言。
但关键在于——Base64 是为了让二进制数据能够通过邮件附件传输而发明的。它是传输格式。是你的邮件客户端发送一张猫咪照片而不损坏字节的方式。没人应该用它来保护什么。
但人们就是会这么做。一直如此。我见过一些代码库里"加密"的密码只是 Base64 编码过的。我见过被称为"API 密钥保险库"的东西其实是一个文本文件里的 Base64 字符串。我见过——我没编——一个创业公司的"专有加密算法",结果就是 Base64 加一个硬编码的盐,而那个盐就是字符串"SALT"。
他们融了 200 万美元。
什么时候真的该用 Base64
听着,Base64 在其用途上很出色。如果你需要在邮件中嵌入图片,就编码它。如果你要通过 JSON API 传输二进制数据,就编码它。如果你需要把你的猫咪照片变成一串字母——随意。我们的 Base64 encoder 就在那里,它完美工作。
但如果你是在试图保护数据,请用真正的加密。AES、bcrypt、argon2——选一个你喜欢的。它们都需要密钥或盐,而不是一个来自 1980 年代的公开文档算法。
恳请
拜托了,看在所有神圣事物的份上,别再拿 Base64 当安全措施了。它不是加密。不是密码。不是秘密。它是个小把戏。用它来做它该做的事,用真正的加密来保护真正的秘密,让我保住我剩下的舌头。