“把它转成乱码就安全了”——如果你也这么想过,那大概率说的是 Base64。它只是换了一套字母表重新编码,谁都能倒回原文,根本不需要钥匙。编码、哈希、加密、签名,是四件完全不同、却被长期混用的工具。用错位,就是漏。
一、四件工具,各管一段
- 编码(Encoding,如 Base64):换样子,让数据能“过管道”,不提供任何保密;
- 哈希(Hashing,如 SHA-256、SM3):按手印,单向不可逆,用于校验与存密码;
- 加密(Encryption,如 AES-256-GCM、SM4-GCM):上锁,有钥匙才能读回;
- 签名(Signature,如 Ed25519、RSA):盖章,证明“谁发的、有没有被改”,公开可验但不保密。
二、两句话就能分清
只问两句:要不要钥匙?能不能倒回来?
- 编码:不要钥匙,能倒回来(传输/展示)
- 哈希:不要钥匙,倒不回来(校验/存密码)
- 加密:要钥匙,能倒回来(保密)
- 签名:要钥匙,认人、不保密(证明来源)
三、用错位就是漏
- 拿编码当保密:Base64 一倒回来就漏;
- 拿哈希当签名:认不出“是谁”;
- 拿加密存密码:钥匙一泄等于明文;
- 拿签名当加密:签名根本不管保密。
四、真实教训:Heartbleed(CVE-2014-0160)
2014 年,OpenSSL 因缺少越界检查,一次可泄露服务器内存最多 64KB,可能包含私钥。依赖这把钥匙保密和签名的数据全部失去意义——而编码和哈希不用钥匙,反而不受影响。加密和签名都系在“钥匙”上。
五、工程实践
- 编码只用 Base64 搬运与展示,绝不当保密;
- 哈希用 SHA-256 / HMAC-SHA256 / SM3,用于校验与密码存储(配合 bcrypt / argon2 加盐);
- 加密只选带完整性校验的 AEAD(AES-256-GCM / SM4-GCM);
- 签名用 Ed25519,公钥公开可验。
以上实践来自我们构建开源身份层 Autional 的经验,官网:Autional — Identity for AI-Generated Applications 。四件工具各管一段,串一个就漏。
参考:RFC 4648、FIPS 180-4、FIPS 197 / NIST SP 800-38D、RFC 8032;Heartbleed(CVE-2014-0160)。