现代密码学入门:对称加密、非对称加密与哈希¶
三个绕不开的问题¶
密码学听起来高深,但日常工程里只反复面对三个问题:
- 数据怎么加密存储/传输? —— 对称加密
- 密钥怎么安全交换? —— 非对称加密
- 数据怎么验真/验完整性? —— 哈希与签名
把这三件事搞懂,Web 安全 80% 的概念都能串起来。
一、对称加密:快,但要解决密钥分发¶
原理¶
加密和解密用同一个密钥:
明文 + 密钥 → 密文
密文 + 密钥 → 明文
常见算法¶
| 算法 | 密钥长度 | 特点 |
|---|---|---|
| AES | 128/192/256 | 现代标准,硬件加速好 |
| ChaCha20 | 256 | 移动端/无硬件加速场景友好 |
| DES/3DES | 56/112 | 已过时,不要用 |
分组模式¶
AES 是分组密码,需要选择工作模式:
- ECB:相同明文块产生相同密文块,不安全(可被模式分析)
- CBC:每块与前一密文异或,需要随机 IV
- GCM:AEAD 模式,同时提供加密和完整性校验,推荐
# AES-256-GCM 示例(Python)
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
nonce = os.urandom(12) # GCM 推荐 12 字节 nonce
ciphertext = aesgcm.encrypt(nonce, b"secret message", b"aad")
plaintext = aesgcm.decrypt(nonce, ciphertext, b"aad")
对称加密的死穴¶
密钥分发:通信双方怎么安全地拿到同一个密钥?如果通过不安全通道传输,密钥本身就可能被窃取。这就引出了非对称加密。
二、非对称加密:慢,但解决密钥交换¶
原理¶
一对密钥:公钥加密,私钥解密(反之亦可签名):
明文 + 公钥 → 密文(只有私钥能解开)
密文 + 私钥 → 明文
公钥可以公开分发,私钥自己保管。解决了对称加密的密钥分发问题。
常见算法¶
| 算法 | 用途 | 密钥长度 | 现状 |
|---|---|---|---|
| RSA | 加密/签名 | 2048/3072/4096 | 主流但渐被替代 |
| ECDSA | 签名 | 256 | 效率高,推荐 |
| ECDH | 密钥交换 | 256 | HTTPS 密钥协商用 |
经典场景:HTTPS 握手简化版¶
1. Client → Server: 你好,我要建立安全连接
2. Server → Client: 这是我的证书(含公钥)
3. Client: 验证证书 → 用服务器公钥加密一个随机密钥 K 发给 Server
4. Server: 用私钥解出 K
5. 双方用 K 做对称加密通信(快)
核心思想:非对称加密只用于传递会话密钥,实际数据传输用对称加密——兼顾安全与性能。这就是混合加密。
三、哈希:单向不可逆¶
特性¶
- 任意长度输入 → 固定长度输出
- 单向:无法从哈希反推原文
- 雪崩效应:输入改一个字节,输出面目全非
- 抗碰撞:很难找到两个不同输入得到相同哈希
常见算法¶
| 算法 | 输出长度 | 用途 | 现状 |
|---|---|---|---|
| MD5 | 128bit | 校验 | 不安全,防碰撞已破解 |
| SHA-1 | 160bit | 兼容 | 不安全,已被碰撞攻击 |
| SHA-256 | 256bit | 签名/校验 | 推荐 |
| bcrypt/argon2 | 可变 | 密码存储 | 密码存储专用 |
密码存储为什么不能用 SHA-256¶
# 错误:明文哈希,彩虹表一查一个准
hash(password)
# 错误:加固定盐,不同用户同密码仍同哈希
hash(salt + password)
# 正确:加随机盐 + 慢哈希(计算成本高,抗暴力破解)
import bcrypt
hashed = bcrypt.hashpw(b"my_password", bcrypt.gensalt(rounds=12))
慢哈希让暴力破解变慢是特性不是缺陷——攻击者跑一遍字典要几年,而你验证一次只慢几十毫秒。
四、数字签名与证书¶
签名流程¶
发送方:私钥 对 消息哈希 签名 → 发送 消息 + 签名
接收方:公钥 验签 → 确认消息未被篡改且来自发送方
证书链¶
公钥如何确认"真的是对方"?引入第三方信任锚:
浏览器信任根证书 → 根证书签发中间证书 → 中间证书签发网站证书
证书包含:域名、公钥、签发者、有效期、签名。浏览器验证证书签名是否有效,确认无误后建立 TLS 连接。这就是 PKI(公钥基础设施)的基本模型。
五、工程实践清单¶
- 加密算法只用现代标准:AES-256-GCM、ChaCha20、ECDSA、SHA-256
- 密码存储用 bcrypt/argon2/scrypt,永远不自己设计哈希方案
- 密钥管理:密钥与代码分离,用 KMS/环境变量/密钥管理服务
- IV/Nonce 必须随机且唯一:GCM 模式 nonce 重用是灾难
- TLS 配置:只启用 TLS 1.2+,证书用 ECDSA 或 RSA-2048+
- 不要自己造密码学:用成熟的库(OpenSSL、libsodium、cryptography.io)
结语¶
密码学的正确姿势是"会选、会用、不自己造"。对称加密管速度,非对称加密管密钥分发,哈希管完整性——三者组合起来,就是 HTTPS、文件加密、密码存储这些日常场景的全部基础。