首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

HTTPS SSL/TLS 握手密鑰導出:Pre-Master Secret 到 Master Secret 完整計算流程

     編輯:關於C語言

背景

SSL/TLS 安全性核心在於主密鑰導出。許多開發者對 Pre-Master Secret、Master Secret、Session Key 的生成過程感到困惑。本文結合 RFC 5246 (TLS 1.2) 及 OpenSSL 源碼,梳理完整計算鏈路。

關鍵隨機數來源

  • Client Random (32 bytes):ClientHello 中發送,含 4 字節 Unix 時間 + 28 字節隨機數。
  • Server Random (32 bytes):ServerHello 中發送,結構相同。
  • 兩者均為明文傳輸,不保密,但參與密鑰導出增加熵值。

Pre-Master Secret (PMS) 生成

取決於密鑰交換算法:

KEX 算法PMS 生成方式備註
RSA客戶端生成 48 字節隨機數,用服務器公鑰加密發送需保證隨機數質量
DHE_RSA / DHE_DSS雙方交換 DH 公鑰,計算共享密鑰 g^xy mod p提供前向保密
ECDHE_RSA / ECDHE_ECDSA橢圓曲線 DH,計算共享點 x 坐標性能更優,推薦使用
PSK預共享密鑰直接作為 PMS輕量級場景

關鍵點:PMS 必須保密,一旦洩露,整個會話安全性崩塌。

Master Secret (MS) 導出 — PRF 函數

TLS 1.2 使用基於 HMAC 的擬隨機函數 (PRF):


Master Secret = PRF(Pre-Master Secret,
                    "master secret",
                    Client Random + Server Random) [0..47]
  • 輸入:PMS (48 bytes)、固定標籤 "master secret"、Client Random + Server Random (64 bytes)。
  • 輸出:48 字節 Master Secret。
  • PRF 內部: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 依次切分出:

  • Client Write MAC Key
  • Server Write MAC Key
  • Client Write Encryption Key
  • Server Write Encryption Key
  • Client Write IV (CBC/GCM)
  • Server Write IV

TLS 1.3 關鍵變化

項目TLS 1.2TLS 1.3
密鑰導出函數PRF (HMAC-based)HKDF (HMAC-based Key Derivation Function)
握手階段多次往返1-RTT / 0-RTT
靜態 RSA支持移除(強制前向保密)
Master Secret 概念顯式存在隱式融合在 HKDF 流程中

OpenSSL 相關源碼路徑

  • ssl/statem/statem_lib.c:tls1_generate_master_secret()
  • ssl/t1_prf.c:tls1_PRF() 實現
  • crypto/evp/p_keyg.c:EVP_PKEY_derive() (ECDHE)

安全建議

  1. 優先使用 ECDHE 密鑰套件,確保前向保密。
  2. 確保隨機數生成器 (CSPRNG) 質量高,Client/Server Random 及 PMS 均依賴它。
  3. 防範 LOGJAM、FREAK 等降級攻擊,禁用弱套件。
  4. 生產環境啟用 TLS 1.3,簡化握手並移除歷史包袱。

總結流程圖

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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved