第三章 密码学基础:对称加密、非对称加密、哈希函数
聊TLS之前,咱得先把密码学那几样看家本事理清楚。对称加密、非对称加密、哈希函数,这三兄弟是TLS握手的基石。我刚开始接触时也觉得它们又绕又抽象,后来踩了几个坑才搞明白——说白了,它们是解决三个不同问题的工具。
对称加密:又快又简单,但钥匙怎么给?
对称加密就好比你和朋友共用一个信箱,同一个钥匙开锁、上锁。加密和解密用的都是同一个密钥。谁拿到这把钥匙,谁就能看你的信。
- 优点:速度快,适合大量数据加密。
- 缺点:密钥分发是个大麻烦。你想想看,两个人之间还好,如果有一百个人要互相通信,每个人都要保存99个不同的密钥,管理起来简直灾难。
常见算法:AES(高级加密标准)、ChaCha20、DES(已淘汰)。
我的经验:AES-128-GCM 是目前TLS里的主流。我个人习惯优先用GCM模式,因为它同时提供了加密和完整性校验,不用再额外加MAC。我在项目里遇到过用AES-CBC然后忘了加HMAC的情况,结果数据被篡改都没发现,那叫一个尴尬。
非对称加密:一对钥匙,一个公开一个私藏
非对称加密用一对密钥:公钥和私钥。公钥可以随便给别人,私钥自己藏好。用公钥加密的数据,只有私钥能解开;反过来,用私钥签名的东西,公钥能验证。
这解决了对称加密的密钥分发难题。但代价是慢,比对称加密慢几百上千倍。所以TLS里不会直接用非对称加密去加密整个会话——太慢了。
常见算法:RSA、ECDSA、Ed25519、DH(Diffie-Hellman)、ECDH。
核心思路:TLS握手阶段先用非对称加密协商出一个临时的对称密钥(会话密钥),然后接下来的通信全用对称加密。这叫“混合加密”,兼顾了安全性和性能。
哈希函数:给数据打个指纹
哈希函数能把任意长度的数据,压缩成一个固定长度的摘要(digest)。这个过程是单向的——你没法从摘要反推出原始数据。
它的三大特性:
- 抗原像性:知道摘要,几乎不可能找到原数据。
- 抗第二原像性:已知一条数据和它的摘要,很难找到另一条数据产生相同的摘要。
- 抗碰撞性:很难找到两条不同数据产生相同摘要。
常见算法:SHA-256、SHA-384、SHA-3、MD5(已破,千万别用)。
避坑指南:我曾经在一个旧项目里看到有人用MD5做数字签名,结果被碰撞攻击干掉了。后来我强制团队只允许SHA-256及以上。记住,哈希函数不是加密,它不保护机密性,只保护完整性。
TLS里它们怎么配合?
我画了一张图,把三兄弟在TLS里的关系串起来。你看一眼就能明白。
密码学在TLS中的具体角色
好的,咱们把三兄弟放到TLS握手流程里,看它们各自站什么岗。
| 阶段 | 所用密码技术 | 干什么用 |
|---|---|---|
| ClientHello / ServerHello | 密码套件协商 | 双方确定用什么算法 |
| 密钥交换(如 ECDHE) | 非对称加密 + DH | 生成临时对称密钥(前向安全) |
| 证书验证 | 非对称加密(签名) | 服务器证明自己身份 |
| Finished 消息 | 哈希(HMAC) | 验证握手消息没被篡改 |
| 记录层数据 | 对称加密 + 哈希(AEAD) | 保护应用数据的机密性和完整性 |
你注意到没?哈希函数在Finished消息里被用来计算握手消息的校验和。如果中间人篡改了ClientHello或者ServerHello,两边算出来的哈希值就不一致,连接直接断开。这就是完整性的威力。
知识点总结:
- 对称加密 → 快,用于大数据量加密,密钥分发依赖非对称加密。
- 非对称加密 → 慢,用于密钥协商和身份认证。
- 哈希函数 → 单向,用于完整性校验和数字签名。
- TLS使用混合加密:非对称加密做大门口的安全验证,对称加密做房间里的日常通信。
避坑:不要混淆“加密”和“签名”
我曾经见过新人用RSA公钥去加密一个文件,然后用私钥去解密——这没问题。但有人反过来用私钥加密数据,想当然以为公钥能当“验证”用。这其实是错的。RSA的私钥加密不是标准签名,虽然数学上能算,但实际应用中应该用专门的签名算法(比如RSA-PSS或ECDSA)。
再一个坑:哈希函数不提供机密性。别把SHA-256算个摘要就当加密了。有次我看到一个程序员把密码直接SHA-256后存数据库,以为这样安全。结果彩虹表一查就破——你该加盐,再用慢哈希如bcrypt。
经验之谈:我在做TLS审计时,经常遇到有人用RSA加密(非AEAD模式)而没用GCM,导致数据完整性缺失。记住现代密码套件都推荐AEAD,比如TLS_AES_128_GCM_SHA256,它在一个操作里完成加密和认证。
密码学强度对比(供选型参考)
| 安全强度(比特) | 对称加密 | 非对称加密 | 哈希函数 |
|---|---|---|---|
| 80(已弱) | 2TDEA(3DES) | RSA 1024 | SHA-1 |
| 128(当前标准) | AES-128 | RSA 3072 / ECDSA P-256 | SHA-256 |
| 256(长期安全) | AES-256 | RSA 15360 / ECDSA P-521 | SHA-384 / SHA-512 |
看到没?对称加密128位强度对应非对称加密需要3072位RSA或者256位椭圆曲线。这是因为非对称加密的数学结构更容易被攻击。你选密码套件时,要保证三个部件都在同一个安全等级上,别出现AES-256配SHA-1这种奇葩组合。
重要提醒:别再支持SHA-1签名证书了!2017年起主流CA就不再签发SHA-1证书,但很多老旧设备还在用。如果你要兼容老系统,至少保证从TLS 1.2开始只允许SHA-256以上哈希。我曾经在嵌入式设备上遇到过必须用SHA-1的情况,最后只能降级到TLS 1.1,但明确告知用户风险。