第三章 密码学基础:对称加密、非对称加密、哈希函数

聊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 中的密码学三兄弟 对称加密 AES-GCM / ChaCha20 非对称加密 ECDHE / RSA / Ed25519 哈希函数 SHA-256 / SHA-384 会话数据加密 记录层保护 密钥协商与身份认证 握手阶段 完整性校验/数字签名 Finished / CertificateVerify 安全通信通道 机密性 + 完整性 + 身份可信 非对称加密传输对称密钥 对称加密传输数据

密码学在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,但明确告知用户风险。