SSLv1 從未公開發布(因嚴重安全漏洞),SSLv2/v3 已棄用,現代 TLS 1.2/1.3 才是主流。但理解「密鑰導出」核心邏輯,對掌握 HTTPS 安全本質至關重要。本文以 TLS 1.2 為基準,深度剖析密鑰導出全過程。
密鑰導出的「種子」來自握手階段交換的三個隨機數:
master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)[0..47] // 48 字節
P_hash,基於 HMAC-SHA256(或 SHA384)key_block = PRF(master_secret, "key expansion",
ServerHello.random + ClientHello.random) // 變長輸出
密鑰塊長度取決於協商的加密套件,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 需要:
從 Key Block 依序切割分配給六個方向:
Client Hello 發送支援的 Cipher Suites 列表,Server 選擇最強匹配。套件定義了:
不同套件 → 不同 Key Block 長度 → 不同切割方式,這就是「六個會話密鑰」的由來。
想看真實導出邏輯,建議閱讀 OpenSSL 源碼:
ssl/statem/statem_lib.c:握手狀態機ssl/t1_lib.c:TLS 1.2 密鑰導出 tls1_generate_master_secretssl/ssl_lib.c:ssl_generate_master_secret 統一入口crypto/hkdf/hkdf.c:TLS 1.3 HKDF 實現密鑰導出本質是:三個隨機數(種子)+ 協商套件(算法參數) → PRF/HKDF 擴展 → 切割分派。沒有神秘魔法,只有精密的密碼學工程。掌握這條主線,SSL/TLS 所有變體(DTLS、QUIC、mTLS)的密鑰邏輯皆可觸類旁通。