相关原理

密码学基础

TLS 用到的两类密码:密钥交换与前向保密、AEAD、密钥派生,以及密码套件名字的读法
本文只讲算法,不涉及协议流程与配置。握手各步骤与证书见 TLS 与证书。

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对称加密算法与模式
SHA256PRF 使用的哈希

认证段也可能写成 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,并靠记录序号防重放
  • 套件名就是一句话:用什么协商、用什么证明、用什么加密、用什么派生