TLS 1.3 與它的前身大不相同。
移除的東西#
- 淘汰弱演算法:MD5、SHA-1、RC4,以及 CBC 模式的 AES。
- 只支援鑑別式密碼:TLS 1.2 經常用「密碼 + MAC」(例如 HMAC-SHA-1)的 MAC-then-encrypt 建構保護記錄,TLS 1.3 則只支援更有效率也更安全的鑑別式密碼。
- 捨棄橢圓曲線點編碼協商:為每條曲線定義單一的點格式。
- 捨棄選用的資料壓縮。
TLS 1.3 主要的開發目標之一,就是移除 1.2 中削弱協定的功能,降低協定整體的複雜度,從而縮小它的攻擊面。
例如捨棄資料壓縮,正是因為該功能促成了針對 TLS 1.2 的 CRIME 攻擊——該攻擊利用了「一則訊息壓縮後的長度會洩漏訊息內容的資訊」這個事實。
新增的東西#
TLS 1.3 也帶來讓連線更安全或更高效的新功能。以下談三個。
降級保護#
降級保護(downgrade protection)是針對降級攻擊的防禦——攻擊者強迫客戶端與伺服器使用比 1.3 更弱的 TLS 版本。
執行降級攻擊的方式:攻擊者攔截並修改 ClientHello 訊息,告訴伺服器該客戶端不支援 TLS 1.3,藉此強迫伺服器使用較弱的 TLS 版本。
接著攻擊者就能利用舊版 TLS 中的漏洞。
防禦機制:TLS 1.3 伺服器在 ServerHello 訊息所送的 32 位元組隨機值中,用三種樣式來標示所請求的連線型態。這個樣式應該與客戶端所請求的 TLS 連線型態相符——若客戶端收到錯誤的樣式,它就知道出事了。
| 客戶端請求的版本 | ServerHello 隨機值的前 8 個位元組 |
|---|---|
| TLS 1.2 | 44 4F 57 4E 47 52 44 01 |
| TLS 1.1 | 44 4F 57 4E 47 52 44 00 |
| TLS 1.3 | 應為隨機 |
例如客戶端送出請求 TLS 1.3 連線的 ClientHello,但網路上的攻擊者把它改成請求 TLS 1.1 連線。當客戶端收到帶有錯誤樣式的 ServerHello 時,它就會知道自己的 ClientHello 訊息被修改過了。
攻擊者無法任意修改伺服器的 32 位元組隨機值,因為這個值是經過密碼學簽章的。
單次往返握手#
典型的 TLS 1.2 握手中,客戶端送出資料、等待回應、再送出更多資料、再等待伺服器回應,然後才開始送加密訊息——延遲是兩次往返時間(RTT)。
相對地,TLS 1.3 的握手只需要一次往返時間。
省下的時間可能是數百毫秒。這聽起來不多,但當你考慮到熱門服務的伺服器每秒要處理數千條連線時,這其實相當可觀。
工作階段恢復#
TLS 1.3 比 1.2 快,但還能更快——藉由完全消除加密工作階段之前的往返。
訣竅是使用工作階段恢復(session resumption):利用客戶端與伺服器在先前工作階段中交換的預共享金鑰,來啟動一個新的工作階段。
工作階段恢復帶來兩大好處:
- 客戶端可以立刻開始加密。
- 後續工作階段不需要使用憑證。
流程:
客戶端 伺服器
產生金鑰對 (c, C = cQ)
ClientHello ──→ 產生金鑰對 (s, S = sQ)
- 預共享金鑰(PSK)ID 導出 keys = KDF(PSK, DH(s, C))
- 公鑰 C
- 0-RTT 資料
←── ServerHello
導出 keys = KDF(PSK, DH(c, S)) - 預共享金鑰(PSK)ID
用 keys 驗證 MAC - 公鑰 S
←── MAC(對 ClientHello、ServerHello)說明:
- 客戶端送出的 ClientHello 包含已與伺服器共享之金鑰的識別碼(記為 PSK)以及一把新的 DH 公鑰。
- 客戶端也可以在這第一則訊息中就夾帶加密資料——這類資料稱為 0-RTT 資料。
- 伺服器回應 ClientHello 時,提供對所交換資料的 MAC。
- 客戶端驗證該 MAC,就知道自己正在與先前同一台伺服器對話,使得憑證驗證變得有些多餘。
- 客戶端與伺服器如同一般握手那樣執行 Diffie–Hellman 金鑰協商,後續訊息使用同時依賴 PSK 與新算出之 DH 共享秘密的金鑰加密。
