SSL/TLS 安全性核心在於主密鑰導出。許多開發者對 Pre-Master Secret、Master Secret、Session Key 的生成過程感到困惑。本文結合 RFC 5246 (TLS 1.2) 及 OpenSSL 源碼,梳理完整計算鏈路。
ClientHello 中發送,含 4 字節 Unix 時間 + 28 字節隨機數。ServerHello 中發送,結構相同。取決於密鑰交換算法:
| KEX 算法 | PMS 生成方式 | 備註 |
|---|---|---|
| RSA | 客戶端生成 48 字節隨機數,用服務器公鑰加密發送 | 需保證隨機數質量 |
| DHE_RSA / DHE_DSS | 雙方交換 DH 公鑰,計算共享密鑰 g^xy mod p | 提供前向保密 |
| ECDHE_RSA / ECDHE_ECDSA | 橢圓曲線 DH,計算共享點 x 坐標 | 性能更優,推薦使用 |
| PSK | 預共享密鑰直接作為 PMS | 輕量級場景 |
關鍵點:PMS 必須保密,一旦洩露,整個會話安全性崩塌。
TLS 1.2 使用基於 HMAC 的擬隨機函數 (PRF):
Master Secret = PRF(Pre-Master Secret,
"master secret",
Client Random + Server Random) [0..47]
"master secret"、Client Random + Server Random (64 bytes)。P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + HMAC_hash(secret, A(2) + seed) + ...,其中 A(0)=seed, A(i)=HMAC_hash(secret, A(i-1))。TLS 1.2 默認 hash = SHA-256。
Key Block = PRF(Master Secret,
"key expansion",
Server Random + Client Random) // 注意順序互換
從 Key Block 依次切分出:
| 項目 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 密鑰導出函數 | PRF (HMAC-based) | HKDF (HMAC-based Key Derivation Function) |
| 握手階段 | 多次往返 | 1-RTT / 0-RTT |
| 靜態 RSA | 支持 | 移除(強制前向保密) |
| Master Secret 概念 | 顯式存在 | 隱式融合在 HKDF 流程中 |
ssl/statem/statem_lib.c:tls1_generate_master_secret()ssl/t1_prf.c:tls1_PRF() 實現crypto/evp/p_keyg.c:EVP_PKEY_derive() (ECDHE)Client/Server Random 及 PMS 均依賴它。
Client Random (32B) ──────┐
│
Server Random (32B) ──────┼──► PRF("master secret") ──► Master Secret (48B)
│
Pre-Master Secret (48B) ──┘
│
▼
PRF("key expansion")
│
▼
Key Block ──► 分割為各類會話密鑰 (Enc Key, MAC Key, IV)