為什麼 TLS 中沒有“臨時非 DH EC”密鑰交換?
在 RSA 密鑰交換中,客戶端選擇一個 premaster secret 並使用伺服器證書中的 RSA 公鑰對其進行加密,然後將其發送到伺服器。這不提供前向保密。
在 ECDHE 密鑰交換中,客戶端和伺服器都生成臨時 EC 密鑰對,並使用 DH 密鑰交換來協商預主密鑰。伺服器公共臨時公鑰使用伺服器身份驗證證書進行簽名。這提供了前向保密。
在後者中,必須由伺服器和客戶端生成兩個臨時密鑰對。不需要客戶端生成 EC 密鑰對的以下兩種密鑰交換方法的組合如何:
- 伺服器生成臨時 EC 密鑰對,使用伺服器身份驗證證書對公鑰進行簽名。
- 伺服器將臨時 EC 密鑰對公鑰發送給客戶端。
- 客戶端選擇一個預主密鑰,使用伺服器臨時 EC 公鑰對其進行加密並將其發回。
使 ECDHE 出類拔萃的不可避免的缺點是什麼?我沒有看到明顯的安全漏洞。也許難以使用 EC 密鑰對進行加密?
“可能難以使用 EC 密鑰對進行加密?”;是的,因為沒有可以使用的直接 EC 加密原語。ElGamal EC 加密是可能的,但它需要各種技巧才能使其工作。例如,消息到 EC 點的映射。有 ECIES,但這實際上歸結為首先執行 ECDHE,另外還有一個缺點是需要密碼。
除此之外,對於 RSA,密鑰對生成是您可能看到的最慢的算法之一。它不僅速度慢,而且非常不可預測,因為不知道何時找到了兩個必需的素數。使用 EC,這很容易:
- 創建一個介於 1 和 N 之間的隨機數(不包括);
- 執行該數字與基點 G 的點乘以到達公共點。
所以基本上它和DH操作本身一樣快。根本沒有很長的等待時間來生成素數。因此,由於密鑰生成本身不會造成太大問題,因此也沒有迫切需要進行更改。
TLS 1.3 的一個重要想法是減少往返次數。它甚至猜測在另一端出現的初始密鑰協議的算法。然後它可以立即將客戶端的臨時公鑰發送到伺服器,伺服器以伺服器的臨時公鑰響應以設置通道。這樣,加密通道可以(並且將)僅在兩條消息後設置。通過加密,客戶端(必須啟動連接)首先請求公鑰,接收它,然後用它加密。
也就是說,如果客戶端不使用會話恢復,ECDH 會加快速度,這是一個加快速度的單獨技巧。
另一個較小的區別是 ECDH 中的隨機密鑰現在依賴於雙方的隨機數據。不同的客戶端可能具有不同強度的隨機數生成器,並且秘密的加密具有秘密本身不是完全隨機的缺點,例如,當使用不具有密碼安全性的 RNG 時。然而,使用 ECDH 確實意味著一個完全失敗的 RNG 將完全顯示已建立的共享秘密,因為臨時私鑰可能會變得已知。
還要注意,簡單地減少選項的數量是 TLS 1.3 中的一項重要舉措。僅僅為了它而擁有選項只會使協議變得不那麼安全,而不是更安全。恕我直言,對於用於特定密碼套件的各種算法具有不同的安全級別甚至沒有意義(不包括與用於身份驗證的證書的安全級別的差異)。