密码学基础
1. 两类密码
| 对称 | 非对称 | |
|---|---|---|
| 密钥 | 一把,双方共用 | 一对,公钥可公开、私钥自持 |
| 速度 | 快,能处理海量数据 | 慢,通常只处理几十字节 |
| 解决什么 | 保密与完整性 | 密钥分发与身份 |
TLS 的分工很明确:非对称只用来协商会话密钥、并证明服务器身份,真正承运数据的是对称加密。
2. 密钥交换
DH(Diffie-Hellman)让双方各自生成一个私下数值并算出对应的公开值,交换公开值后各算一次,得到同一个共享秘密,而这个秘密从未在链路上传输过。
前缀 E 表示 ephemeral,即每次连接都换一对新的临时密钥。由此带来前向保密:服务器的长期私钥日后泄露,也解不开之前录下的流量,因为当时的临时私钥早已丢弃。
RSA 密钥交换是另一种做法:客户端自己生成会话密钥,用服务器公钥加密后发过去。只要服务器私钥还在,历史流量就能被解开,因此 TLS 1.3 已经把它移除,只保留 (EC)DHE。
ECDH 是同一套运算在椭圆曲线上的形式,参数短、算得快,所以现代部署基本都是 ECDHE;DHE(有限域)仍有实现,但性能差得多。
3. KEM
严格说 DH/ECDH 属于密钥协商:双方各算一次,结果相同。KEM 是另一种模型——一方用对方的公钥把随机密钥封装成密文,另一方用自己的私钥解封得到同一个密钥。
两者正在 TLS 1.3 里被拼起来用:后量子的 ML-KEM 与传统的 X25519 组合成混合方案,一条连接同时依赖两种难题的安全性。
4. 对称加密与 AEAD
握手谈定会话密钥后,数据由对称加密承运。TLS 1.3 只允许 AEAD 类算法,如 AES-GCM 与 ChaCha20-Poly1305:一次运算同时给出密文与认证标签,被改过一个字节都会被拒绝。
TLS 还给每条记录编号,并把序号纳入运算,因此重放、重排、截断都能被发现。
5. 密钥派生
共享秘密不会被直接当作会话密钥。TLS 1.2 把它与双方随机数一起送入 PRF 派生出主密钥;TLS 1.3 用 HKDF,逐步把共享秘密与整段握手记录的哈希扩展开。派生出的不止一把:握手一把、应用数据一把,两个方向再各分开。
这样每段数据用不同的密钥,某一把泄露不会牵连其他阶段;双方随机数参与其中,也让每次连接的结果都不同。
6. 密码套件怎么读
TLS 1.2 的套件名由几段拼成,例如 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
| 段 | 含义 |
|---|---|
TLS | 协议 |
ECDHE | 密钥交换算法 |
ECDSA | 认证用的签名算法 |
AES_128_GCM | 对称加密算法与模式 |
SHA256 | PRF 使用的哈希 |
认证段也可能写成 RSA,如 TLS_ECDHE_RSA_WITH_…,同样表示签名,具体策略通常是 RSA-PSS;ECDSA、ED25519 同理,都只表示签名,不表示用它们加密数据。而以 TLS_RSA_WITH_… 开头的套件是静态 RSA 密钥交换,TLS 1.3 已移除。
TLS 1.3 把套件名压到两段,例如 TLS_AES_128_GCM_SHA256:密钥交换由 supported_groups 扩展单独协商,签名算法由 signature_algorithms 扩展单独协商,套件名里只剩对称加密与哈希。
7. 对照
| 握手里的一步 | 用到的密码 |
|---|---|
| 选版本与密码套件 | 无,纯协商 |
| 交换临时公钥 | (EC)DHE,或混合 KEM |
| 证明身份 | 证书链验签 + CertificateVerify 签名 |
| 导出会话密钥 | HKDF / PRF |
| 传输应用数据 | AEAD 对称加密 |
8. 结论
- 非对称负责「谈」,对称负责「运」
- (EC)DHE 的临时密钥带来前向保密,RSA 密钥交换没有,已被 1.3 移除
- 现代 TLS 只用 AEAD,并靠记录序号防重放
- 套件名就是一句话:用什么协商、用什么证明、用什么加密、用什么派生