第一章 密码学基础:对称加密、非对称加密与哈希函数
说到密码学,很多人第一反应就是“加解密”。其实它远不止这些。我做了十年安全,最深的体会是:密码学是信任的数学基石。你想想看,互联网上两个陌生人怎么互相信任对方没改过数据?靠的就是这三类工具:对称加密、非对称加密、哈希函数。
这一章我们不讲复杂的数学公式,而是用工程师的直觉去理解它们到底解决了什么问题。
1.1 对称加密 —— 一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一个密钥。你家里门锁的钥匙就是对称的——你用同一把钥匙锁门、开门。
常见的对称算法有 AES、DES、3DES、SM4(国密)。现在实际项目里几乎只用 AES-256,DES 早就不推荐了。
个人习惯:我一般用 AES-256-GCM 模式。GCM 模式自带认证标签,能防止数据被篡改,省得再单独加一个 HMAC。
看一个简单的 AES 加密例子(Python 用 cryptography 库):
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = AESGCM.generate_key(bit_length=256) # 生成 256 位密钥
nonce = os.urandom(12) # 随机 nonce,12 字节
aesgcm = AESGCM(key)
plaintext = b"Hello, Key Boundary!"
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
print(ciphertext.hex())
1.2 非对称加密 —— 公钥私钥,各司其职
非对称加密有两个钥匙:公钥可以公开,私钥只有自己知道。你拿公钥加密的数据,只有私钥能解开;反过来,私钥签名,公钥验签。
我遇到过最惊险的一次:客户的 HTTPS 证书私钥被运维误删了。幸好备份在离线 HSM 里,不然整个电商平台都得瘫痪。所以记住:私钥一旦泄露,整个信任体系就崩了。
主流算法:
- RSA:经典但慢,2048 位起步,4096 位更安全。
- ECC(椭圆曲线):更短的密钥达到相同安全级别,推荐 Curve25519 或 P-256。
- SM2:国密标准,基于 ECC。
举个 ECC 加密的例子(Elliptic Curve Integrated Encryption Scheme,ECIES):
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
# 公钥序列化后发给对方
pub_bytes = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
避坑指南:我曾经在项目中直接用 RSA 加密大文件,结果性能惨不忍睹。正确做法是:用对称密钥加密文件,再用非对称加密那把对称密钥。这叫“混合加密”,HTTPS 就是这么做的。
1.3 哈希函数 —— 数据的数字指纹
哈希函数把任意长度的数据变成固定长度的“摘要”。它不可逆,而且哪怕只改一个比特,摘要就完全不同。
我用哈希最多的场景是:校验文件完整性、密码存储、数字签名。
| 算法 | 输出长度 | 安全性 | 推荐场景 |
|---|---|---|---|
| MD5 | 128 位 | 已破解,不推荐 | 仅用于非安全校验 |
| SHA-1 | 160 位 | 已削弱,避免使用 | 历史遗留系统 |
| SHA-256 | 256 位 | 安全 | 通用场景 |
| SHA-3 | 可变 | 安全 | 新项目可选 |
| SM3 | 256 位 | 安全(国密) | 国内合规需求 |
关键点:哈希不是加密。它没有密钥,不能还原原文。如果有人跟你说“哈希解密”,那一定是撞库或者彩虹表攻击。
用 Python 算个 SHA-256 看看:
import hashlib
data = b"Key Boundary Blue Book"
digest = hashlib.sha256(data).hexdigest()
print(digest)
# 输出:e3b0c44298fc1c149afbf4c8996fb924...
1.4 三者的核心逻辑与关系
我习惯把这三者画成一个框架图。你跟着过一遍,以后看任何密码系统都能对号入座。
一句话总结:对称加密管速度(快),非对称加密管安全分发(慢但安全),哈希函数管完整性(不可逆)。三者缺一不可。
1.5 实际项目中的避坑清单
我整理了一些自己踩过的坑,你以后大概率也会遇到:
- 不要在 ECB 模式下用对称加密——相同明文块会产生相同密文块,泄露结构。我当年给客户做数据库列加密,差点用 ECB,幸好 review 时被同事发现。
- 不要用 RSA 直接加密长数据——RSA 最多加密密钥长度减 11 字节(比如 2048 位 RSA 只能加密 245 字节),更长的数据要用混合加密。
- 哈希不能代替密码存储的加盐——直接对密码做 SHA-256,撞库一秒出结果。一定要用 bcrypt/scrypt/Argon2 这些慢哈希,并且每用户随机盐。
- 不要自己实现密码算法——我见过有人手写 AES,性能差还容易出侧信道漏洞。用成熟的库(OpenSSL, libsodium, cryptography)就好。
曾经踩过的坑:有个项目因为非对称加密的密钥对没有做定期轮换,私钥被暴力猜解。从那以后我强制 key rotation 周期不超过 1 年,并且私钥必须存储在 HSM 或硬件安全模块中。
1.6 本章知识结构速查
| 密码工具 | 保证什么 | 典型算法 | 密钥管理重点 |
|---|---|---|---|
| 对称加密 | 机密性 | AES-256, SM4 | 密钥分发难,需要非对称或 KDC 协助 |
| 非对称加密 | 机密性 + 认证 | ECC, RSA, SM2 | 私钥必须安全存储,公钥可公开 |
| 哈希函数 | 完整性 | SHA-256, SM3 | 无需密钥,但要注意加盐防彩虹表 |