密码学基础:对称加密、非对称加密、哈希、数字签名
你学 TLS,绕不开密码学基础。别慌,我不打算给你填一堆数学公式。咱就把这四样东西说清楚,它们是怎么拧成一股绳的。
对称加密:快就一个字
对称加密,说白了就是加解密用同一把钥匙。你拿钥匙锁门,也用这把钥匙开门。效率高,适合传大块数据。
典型算法:AES、DES、3DES、SM4(国密)。现在主流是 AES-256。
我个人的经验:做支付接口时,敏感数据报文常先用对称加密。速度快,一方生成密钥,另一方拿到后解密。但问题来了——密钥怎么安全地传过去?这不,非对称加密就上场了。
非对称加密:不对称才是美
非对称加密有两把钥匙:公钥加密,私钥解密。公钥随便发,私钥自己死死藏好。
主要算法:RSA、ECC、SM2。RSA 用得广,但 ECC 在同等安全强度下密钥更短,性能更好。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 一把 | 两把(公/私) |
| 速度 | 快(硬件加速常见) | 慢(100~1000倍差距) |
| 典型用途 | 大量数据传输 | 密钥交换、数字签名 |
| 安全分发难度 | 高(需事先共享) | 低(公钥可公开) |
回想一下,我是怎么在 HTTPS 里用 AES 加密响应体的?其实就是靠非对称加密先把 AES 密钥传过去,再切到对称加密干活。这叫「混合加密」。
面试常问:为什么不用 RSA 直接加密全部数据?答:性能太差,一个请求几兆数据,用 RSA 加密能把 CPU 跑冒烟。
哈希:指纹(不可逆)
哈希能把任意数据变成固定长度的指纹。输入变了,指纹一定变。而且指纹不能反推出原文。
常见算法:MD5(已破不建议用)、SHA-1(已破)、SHA-256、SM3。
我习惯用 SHA-256 做消息完整性校验。TLS 里每个握手消息都会带一段哈希值,防止中途被篡改。
避坑指南:我曾经见过有人用 MD5 存用户密码,结果被彩虹表一阵乱打,全库沦陷。现在至少得加盐 + 慢哈希(bcrypt/scrypt)。但哈希本身不擅长存密码,它是校验工具,不是加密工具。
数字签名:让我相信你就是你
数字签名 = 哈希 + 非对称加密。流程这么走:
- 发送方对原始数据算哈希。
- 用私钥加密这个哈希,得到签名。
- 接收方用公钥解密签名,得到哈希值 A。
- 对收到的原始数据直接算哈希,得到哈希值 B。
- 比较 A 和 B:一样就说明数据来自私钥持有者且没篡改。
你想想看,TLS 的证书本身就是一组数字签名。CA 用私钥对你的证书签名,浏览器用 CA 公钥验证,证明这张证书不是伪造的。
# 用 OpenSSL 演示签名的生成与验证(Python 伪代码风格)
# 假设已有 RSA 密钥对
# 签名
import hashlib
signature = rsa_private_key.sign(hashlib.sha256(data).digest())
# 验证
hash_recovered = rsa_public_key.verify(signature)
assert hash_recovered == hashlib.sha256(data).digest()
四个概念如何协作?
我把这四者的关系画在一张图里,你一看就明白。
看到「数字签名」那块了吧?它就是哈希和非对称加密的合体。而混合加密模式则是非对称先帮你把对称密钥安全传过去,后面就交给对称加密跑高速。
总结一下
- 对称加密:快,适合大数据,但密钥分发难。
- 非对称加密:慢,适合小量关键信息(密钥/签名)。
- 哈希:不可逆,用于校验完整性、防篡改。
- 数字签名:证明身份 + 防篡改,是证书体系的根基。
学 TLS 时别把这几样分开看。实际握手里它们是接力赛运动员——非对称先跑第一棒,对称接棒,哈希和签名在全程做裁判。