總結HTTPS握手層和加密層

前面說過,TLS/SSL協議可以和應用層協議結合,例如HTTP,SMTP和FTP等。提供數據完整性和機密性TLS/SSL協議建立在TCP或UDP之上,應用層協議之下,任何應用層協議使用了TLS,都要先把數據經過TLS/SSL處理。客戶端瀏覽器連接服務器的443端口,發送HTTP數據到TLS/SSL協議,再到傳輸層TCP處。TLS協議部分有握手層和加密層兩部分,握手層在上,加密層在下,握手層負責完成密碼套件,也就是使用的加密算法,密鑰參數生成和交換,發送證書等,最後完成密鑰協商得到預備主密鑰,預備主密鑰用過密鑰衍生算法得到主密鑰,之後就可以把這它交給下面的加密層,完成數據加密和解密。加密層的功能顧名思義,在拿到握手層提供的主密鑰後,對HTTP數據提供完整性和機密性保證。

握手層和加密層流程

       在握手層,負責交換隨機數,密鑰套件和密鑰協商等,無論是RSA還是DH方式,首先都是客戶端發送自己支持的密碼套件給服務器,服務器從中選擇一個密鑰套件,完成密碼套件的協商,然後服務器端發送自己的證書給客戶端進行身份驗證,客戶端完成身份驗證後,可以開始密鑰協商。RSA密鑰協商,客戶端直接把加密後的預備主密鑰發送給服務器端,DH密鑰協商則先由服務器端發送DH參數和DH公鑰給客戶端,客戶端根據DH參數生成自己的密鑰對,再把客戶端DH公鑰發送給服務器端,完成密鑰協商。接下來就可以在通信中進行數據的加密和解密。

握手層

前面說的很清楚,握手階段就是客戶端和服務器端進行信息交換,身份驗證和密鑰協商。

密碼套件

密碼套件是各個密碼學算法的組合,包括加密算法,密鑰協商算法,身份驗證算法,HMAC消息驗證碼算法和PRF僞隨機數算法,客戶端在連接階段將自己支持的密碼套件發送給服務器端,服務器端從中選擇一個自己也支持的密鑰套件。來看一個密碼套件的例子:

TLS_DH_RSA_WITH_AES_CBC_128_SHA

DH表示使用的DH密鑰協商算法,RSA表示身份驗證用到的是RSA公鑰,例如證書中含有的是服務器的RSA公鑰。AEC_CBC_128表示的是使用對稱加密AES算法,CBC塊密碼分組連接模式,密鑰長度爲128比特。SHA是使用的消息驗證碼算法。

      在一次HTTPS請求中,協商密碼套件是必須的,就像密鑰協商一樣,不要使用固定的一套密碼套件,因爲一個服務器通常要處理許多的客戶端連接,每個客戶端所支持的密碼套件是不同的,原因是客戶端可能運行着不同的操作系統,使用不同的瀏覽器,不同的運行環境支持的密碼套件是不同的,如果使用固定的密碼套件,可能會出現某一個算法,在服務器端支持,但在客戶端不支持的情況。所以,客戶端和服務器端在連接階段必須協商出一個雙方都支持的密碼套件。

身份驗證

       在客戶端和服務器端進行密鑰協商交換密鑰信息之前,還要進行身份驗證,客戶端要驗證服務器的身份,通過CA證書,證書中包含了服務器公鑰和使用的數字簽名算法等,當客戶端和服務器端協商好密碼套件後,服務器端會發送自己的證書給客戶端進行驗證,客戶端進行認證使用的技術就是數字簽名技術,數字簽名可以做到防抵賴,防僞造,服務器端在申請CA證書時,把自己的公鑰和CSR證書請求文件發送給CA機構,CA機構使用自己的私鑰對服務器信息進行簽名後放在證書中,客戶端根據證書驗證服務器身份時,使用自己瀏覽器集成的CA機構根證書,裏面包含了CA機構的公鑰,使用該公鑰解密出服務器證書的公鑰信息,最後獲得服務器公鑰。

密鑰協商

通信雙方密鑰協商最後協商出預備主密鑰,預備主密鑰用密鑰衍生算法得到主密鑰,最後拆分成各個密鑰塊。在HTTPS中密鑰協商有RSA和DH兩種算法,不過RSA密鑰協商算不上真正的協商,預備主密鑰可以說是由客戶端確定的,從RSA密鑰協商過程就可以看出:

  1. 客戶端發送連接請求給服務器,服務器迴應自己的公鑰給客戶端。
  2. 客戶端自己生成一個預備主密鑰,並使用服務器公鑰對其進行加密,發送給服務器。
  3. 服務器使用自己的私鑰解密得到預備主密鑰,完成協商。

可與看到,預備主密鑰完全由客戶端生成。

DH密鑰協商則是真正意義上的密鑰協商,協商過程中通信雙方各自提供一部分信息,即使中間一部分被截獲泄露,也無法計算出預備主密鑰,大致過程:

  1. 客戶端請求服務器連接,服務器端生成DH參數和服務器DH密鑰對。
  2. 服務器將DH參數和DH公鑰發送給客戶端,自己保留好DH私鑰。
  3. 客戶端根據DH參數生成自己的密鑰對,並把客戶端DH公鑰發送給服務器。
  4. 最後,客戶端根據自己的私鑰和服務器公鑰計算出預備主密鑰;服務器端同樣根據自己的私鑰和客戶端公鑰計算出預備主密鑰,密鑰協商完成。

DH密鑰協商又可以分爲靜態DH和動態DH兩種,靜態DH就是服務器端的DH參數和服務器公鑰是固定的,每一次客戶端請求連接得到的DH參數和公鑰也都是一樣的。使用靜態DH方式好處是不用每次建立連接時都去重新生成參數,節省了時間,提高了性能,不過致命的缺點就是安全性問題,一旦參數泄露就麻煩了。

      動態DH顯然就是每次客戶端和服務器端建立連接時,都會重新創建DH參數和服務器公鑰,即使中間出現密鑰泄露,也只是這次通信可能造成信息泄露影響,把損失大大地降低。

消息完整性驗證

消息完整性驗證就是用到HMAC消息驗證碼算法,確保消息是沒有經過篡改的,在客戶端和服務器端的消息數據發送過程中,先對消息用HMAC算法計算出摘要值,再和原文消息一起發送出去。另一方接收到消息後,先拆分出原始消息,然後對原始消息計算出摘要值,再和一起發來的摘要值作比較,如一致,則證明消息沒有被篡改過。

加密層

加密層要做的事情就沒握手層那麼多了,在握手層協商出使用的算法後,加密層功能主要集中在加密和解密部分。

流密碼和分組加密

流密碼加密就是之前說到的一次性密碼本爲雛形演變出來的加密模式,在加密前,先計算出消息驗證用的摘要值,然後在對原始消息和摘要值一起進行加密。流密碼加密模式優點是可以並行計算,效率高,不過缺點是現在已被證實不安全。

分組加密模式就是現在常用的了,將加密數據等分成多個分組數據塊,先對原始消息進行加密,然後進行HMAC計算得到摘要值。分組加密優點安全,如CBC分組連接模式,各個分組數據塊之間會建立起某種聯繫(它們的加密密鑰和其他分組數據塊的加密密鑰有關),這樣做雖然犧牲了性能,無法並行處理,但提供的安全性更重要。

發佈了101 篇原創文章 · 獲贊 73 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章