加密(encryption)是什么?常见用途、实现方式与易混淆概念
加密是用密钥把明文转换成密文的过程,只有持有正确密钥的一方能还原出明文。它解决的是"数据被谁看到"的问题,而不是"数据有没有被改过"或"数据能不能被压缩"的问题。如果你要保护传输中的密码、磁盘上的文件、或者一段需要多人协作但不想让平台看到的文本,加密是直接手段;如果你只是要校验文件是否完整,或者把二进制塞进文本协议里,那需要的不是加密。下面按概念、分类、易混点、实现工具和常见坑依次说明。
加密的基本机制
加密由三样东西决定:算法、密钥、以及(多数情况下)随机参数。
- 输入:明文 + 密钥(+ 随机数/IV)。
- 动作:算法按密钥把明文打乱成密文。
- 预期结果:没有密钥的人拿到密文,无法在合理时间内还原;有密钥的人可以解密回明文。
关键点在于:安全性来自密钥,而不是算法保密。现代加密算法(如 AES、ChaCha20)是公开的,公开反而让更多人能审查它。真正需要保密的是密钥本身。
对称加密与非对称加密
这是最核心的一组分类,决定了你该怎么用。
| 维度 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥 | 加密和解密用同一把密钥 | 公钥加密、私钥解密(或反过来签名) |
| 速度 | 快,适合大量数据 | 慢,适合小数据或密钥交换 |
| 典型算法 | AES、ChaCha20 | RSA、ECC |
| 典型场景 | 磁盘加密、文件加密、传输会话内容 | 密钥交换、数字签名、证书 |
| 主要难点 | 怎么把密钥安全地给对方 | 计算开销大、参数选择复杂 |
实际系统通常两者混用:用非对称加密协商出一把临时对称密钥,再用它加密真正的数据。这样既有非对称的密钥分发优势,又有对称的速度。
加密、哈希、编码:别混为一谈
这三个经常被当成一回事,但用途完全不同。
- 加密:可逆(有密钥就能还原),目的是保密。例:AES 加密一段消息。
- 哈希:不可逆,目的是校验或存密码。例:SHA-256、bcrypt。哈希不提供保密性,因为原文根本还原不出来。
- 编码:可逆且不需要密钥,目的是换一种表示形式。例:Base64 把二进制转成文本,任何人都能解回。
一个常见错误是把 Base64 当成加密——它只是编码,没有任何保密作用。另一个错误是用普通哈希(如 MD5、SHA-1)存密码,正确做法是用带盐的慢哈希(如 bcrypt、PBKDF2)。
常见实现与工具
不同场景对应不同工具,选错工具往往比不加密更糟。
- 传输层:TLS/HTTPS,浏览器和服务器自动完成,你通常不需要手动处理。
- 文件与磁盘:GPG(文件/邮件加密)、VeraCrypt、gocryptfs、eCryptfs、EncFS 等。Defuse Security 的审计列表中出现了 gocryptfs、eCryptfs、EncFS、ZeroBin 等加密相关项目,说明这类工具是实际被审查和使用的对象。
- 编程库:OpenSSL 是通用底层库;PHP 生态里有
php-encryption这类封装库,把"选算法、生成 IV、认证"这些容易出错的步骤包起来,降低误用概率。 - 在线工具:Defuse Security 提供 Encrypted Pastebin 这类服务,用于把文本加密后再分享,属于"加密 + 托管"的组合。
选择时优先用成熟的高层库,而不是自己拼底层原语。自己实现加密协议几乎必然出错。
常见误区与失败排查
加密出问题,通常不是算法被攻破,而是用法出错。
- 密钥管理:密钥丢了数据就永久丢失;密钥泄露则加密形同虚设。密钥不能和密文放在一起。
- IV/随机数复用:某些模式(如 CBC)要求每次加密使用不同的随机 IV。复用 IV 会泄露明文规律。Defuse Security 的研究列表里就有 "CBC Mode IV Security" 这一主题,说明这是被反复讨论的真实问题。
- 模式选择:优先选带认证的加密模式(如 AES-GCM、ChaCha20-Poly1305),它能同时保证保密性和完整性。单纯 CBC 不防篡改。
- 把编码当加密:Base64、URL 编码都不提供保密性。
- 用哈希代替加密存密码:密码应该用带盐慢哈希,不是加密也不是快速哈希。
排查思路:先确认"我要的是保密、校验还是编码",再检查密钥是否安全、随机数是否唯一、模式是否带认证。
怎么选
- 只是要传文件或邮件给特定的人:用 GPG 或类似的非对称工具。
- 要保护整块磁盘或目录:用 VeraCrypt、gocryptfs 这类磁盘/文件系统级加密。
- 在代码里加密数据:用语言生态里成熟的加密库,选带认证的模式,不要自己拼。
- 只是要校验文件完整性:用哈希,不要加密。
- 只是要把二进制放进文本:用 Base64,不要当成加密。
判断标准始终是同一个:你要防的是"被看到",还是"被改动",还是"表示形式"。三者对应加密、哈希、编码,选错方向,后面的努力都是白费。