總結HTTPS握手層和加密層

2021-10-02 07:45:11 字數 2868 閱讀 3701

前面說過,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金鑰協商過程就可以看出:

客戶端傳送連線請求給伺服器,伺服器回應自己的公鑰給客戶端。

客戶端自己生成乙個預備主金鑰,並使用伺服器公鑰對其進行加密,傳送給伺服器。

伺服器使用自己的私鑰解密得到預備主金鑰,完成協商。

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

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

客戶端請求伺服器連線,伺服器端生成dh引數和伺服器dh金鑰對。

伺服器將dh引數和dh公鑰傳送給客戶端,自己保留好dh私鑰。

客戶端根據dh引數生成自己的金鑰對,並把客戶端dh公鑰傳送給伺服器。

最後,客戶端根據自己的私鑰和伺服器公鑰計算出預備主金鑰;伺服器端同樣根據自己的私鑰和客戶端公鑰計算出預備主金鑰,金鑰協商完成。

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

動態dh顯然就是每次客戶端和伺服器端建立連線時,都會重新建立dh引數和伺服器公鑰,即使中間出現金鑰洩露,也只是這次通訊可能造成資訊洩露影響,把損失大大地降低。

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

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

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

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

https加密過程(SSL握手)

https在http的基礎上多了ssl加密層。https的加密過程也就是ssl的握手過程。mac金鑰相當於資料校驗,是為了保證資料完整性而存在的。ssl將資料流分割成記錄,每條記錄都會附上乙個mac,然後再對 記錄 mac值 進行加密。比如客戶端要向服務端傳送資料,對於資料的每個記錄,客戶端都會用它...

https和加密方法和hash加鹽

參考 https相比http 就是防止 客戶端和服務端之間互動的資訊,中途被人竊取,通過非對稱加密,來保障客戶端發出去的資訊,只有服務端用自己的私鑰解開,來指導發過來的是什麼資訊。1.確保內容不被竊聽 無法被揭密 先用對方公鑰加密 a b傳送內容,確保內容不被 黑客 攔截並解密內容,a要用用b的非對...

記錄應用層 HTTPS

學習敖丙,傳送門 http 是超文字傳輸協議,資訊是明文傳輸,存在安全風險的問題 https 則解決 http 不安全的缺陷,在 tcp 和 http 應用層之間加入了 ssl tls 安全協議,使得報文能夠加密傳輸 http 連線建立相對簡單,tcp 三次握手之後便可進行 http 的報文傳輸 而...