密码学基础:对称加密、非对称加密、哈希

说到 TLS 1.3,绕不开的就是密码学。很多朋友一听到“密码学”就头疼,觉得是数学家的游戏。其实没那么玄乎。我个人习惯把这三个核心工具比作日常生活中的东西,你一听就懂。

对称加密 — 一把钥匙开一把锁

对称加密,说白了就是加密和解密用同一个密钥。就像你家大门钥匙,出门锁门,回家开门,同一把。

常见的对称加密算法有 AES、ChaCha20。TLS 1.3 里用的就是 AES-256-GCM 和 ChaCha20-Poly1305。我在项目中遇到过一个大坑:曾经有个团队用 AES-CBC 模式,结果没做完整性校验,被 padding oracle 攻击打穿了。嗯,后来全部换成了 GCM 模式。

注意:对称加密虽然快,但密钥分发是大问题。你想想,如果通信双方远隔千里,怎么安全地共享这把钥匙?这就是非对称加密要解决的。

非对称加密 — 公钥私钥的默契

非对称加密有一对密钥:公钥公开,私钥保密。你可以把公钥发给全世界,别人用它加密数据,只有你能用私钥解密。

TLS 1.3 握手阶段用了 ECDHE(椭圆曲线 Diffie-Hellman 密钥交换),每次会话都会临时生成一对密钥对。我建议你记住一点:非对称加密速度慢,所以它只用来协商对称密钥,真正的数据加密还是交给对称加密。

核心原则:非对称加密负责“握手”,对称加密负责“传输”。两者配合,又快又安全。

常见的非对称算法有 RSA(现在 TLS 1.3 已经不推荐用了)、ECDSA、Ed25519。我当年调试过一个 ECDSA 签名验证失败的问题,查了半天发现是曲线参数没对齐——客户端用 P-256,服务端用 P-384。

哈希函数 — 数字指纹

哈希函数就是把任意长度的数据压缩成一个固定长度的摘要。而且不可逆——你无法从摘要反推出原始数据。常用于校验数据完整性、数字签名。

TLS 1.3 里用 SHA-256、SHA-384 做哈希。握手消息的完整性就靠它。我曾经看到有人把哈希和加密混为一谈,其实完全两码事。加密是为了保密,哈希是为了防篡改。

一个小技巧:你在调试 TLS 问题时,可以抓包看 Finished 消息的哈希值。如果客户端和服务器的哈希对不上,说明握手消息被篡改了。

三者如何协同工作

一张图胜过千言万语。下面这个 SVG 展示了 TLS 1.3 握手中三者各司其职:

TLS 1.3 握手中的密码学组件 客户端 服务器 ECDHE 密钥交换 ECDHE 密钥交换 协商临时密钥对 证书 + 签名 验证签名 AES-GCM 对称加密 对称加密传输 SHA-256 哈希 图例 非对称(ECDHE) 数字签名(ECDSA) 对称(AES-GCM)

从图中你能看到:客户端和服务器先用 ECDHE(非对称加密中的密钥交换)协商出一个共享秘密;然后用这个秘密推导出对称密钥;握手消息的完整性靠 SHA-256 哈希来校验;最后再用对称加密传输应用数据。

千万别混用密钥!我见过有人直接用私钥去加密业务数据,说是“更安全”,结果性能一塌糊涂。正确的做法永远是对称加密加密数据,非对称加密只用来协商对称密钥。

三种密码工具对比

特性 对称加密 非对称加密 哈希函数
密钥数量 1 个共享密钥 公钥 + 私钥(2 个) 无密钥
速度 非常快(硬件加速) 慢(尤其是 RSA) 极快
主要用途 数据加密传输 密钥协商、数字签名 完整性校验、消息认证
常见算法(TLS 1.3) AES-256-GCM, ChaCha20-Poly1305 ECDHE, ECDSA, Ed25519 SHA-256, SHA-384
可逆性 可逆(加解密) 可逆(加解密) 不可逆

代码示例:模拟对称加解密

下面是一个 Python 风格的伪代码,帮你理解对称加密的流程。实际 TLS 1.3 底层用的是 OpenSSL 或 BoringSSL,但思想一模一样:

# 伪代码:AES-256-GCM 对称加解密
from cryptography import AES_GCM

# 假设已经通过 ECDHE 协商出共享密钥 key
key = b'32字节的共享秘密...'

# 加密
nonce = generate_random_nonce(12)   # 12 字节随机数
ciphertext, tag = aes_gcm_encrypt(key, nonce, plaintext, aad=None)

# 发送 nonce + ciphertext + tag 给对端

# 解密
plaintext = aes_gcm_decrypt(key, nonce, ciphertext, tag)
注意 nonce(随机数)不要重复使用。同一个 key 下如果 nonce 相同,攻击者能算出密钥流。我当时有一个同事在测试环境忘了重置 nonce 计数器,结果加密结果一模一样,排查了半天。

好,这就是密码学基础的三个核心概念。对称加密、非对称加密、哈希,它们像三根柱子撑起了 TLS 1.3 的安全体系。理解清楚每一个的角色,后面看握手协议会轻松很多。