密码学基础:对称加密、非对称加密、哈希
说到 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 做哈希。握手消息的完整性就靠它。我曾经看到有人把哈希和加密混为一谈,其实完全两码事。加密是为了保密,哈希是为了防篡改。
三者如何协同工作
一张图胜过千言万语。下面这个 SVG 展示了 TLS 1.3 握手中三者各司其职:
从图中你能看到:客户端和服务器先用 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)
好,这就是密码学基础的三个核心概念。对称加密、非对称加密、哈希,它们像三根柱子撑起了 TLS 1.3 的安全体系。理解清楚每一个的角色,后面看握手协议会轻松很多。