一起學習SSL協議原理

2021-09-12 07:16:30 字數 4088 閱讀 3762

ssl,全稱secure socket layer,為netscape所研發,用以保障在internet上資料傳輸之安全。

ssl利用資料加密、身份驗證和訊息完整性驗證機制,為網路上資料的傳輸提供安全性保證。ssl支援各種應用層協議。由於ssl位於應用層和傳輸層之間,所以可以為任何基於tcp等可靠連線的應用層協議提供安全性保證。

1.身份驗證機制

基於證書利用數字簽名方法對伺服器和客戶端進行身份驗證,其中客戶端的身份驗證是可選的。

2.資料傳輸的機密性

利用對稱金鑰演算法對傳輸的資料進行加密。

3.訊息完整性驗證

訊息傳輸過程中使用mac演算法來檢驗訊息的完整性。

1.身份驗證機制

ssl利用數字簽名來驗證通訊對端的身份。

非對稱金鑰演算法可以用來實現數字簽名。由於通過私鑰加密後的資料只能利用對應的公鑰進行解密,因此根據解密是否成功,就可以判斷傳送者的身份,如同傳送者對資料進行了「簽名」。

例如,alice使用自己的私鑰對一段固定的資訊加密後發給bob,bob利用alice的公鑰解密,如果解密結果與固定資訊相同,那麼就能夠確認資訊的傳送者為alice,這個過程就稱為數字簽名。

使用數字簽名驗證身份時,需要確保被驗證者的公鑰是真實的,否則,非法使用者可能會冒充被驗證者與驗證者通訊。如下圖所示,cindy冒充bob,將自己的公鑰發給alice,並利用自己的私鑰計算出簽名傳送給alice,alice利用「bob」的公鑰(實際上為cindy的公鑰)成功驗證該簽名,則alice認為bob的身份驗證成功,而實際上與alice通訊的是冒充bob的cindy。ssl利用pki提供的機制保證公鑰的真實性。

身份驗證.png

2.資料傳輸的機密性

ssl加密通道上的資料加解密使用對稱金鑰演算法,目前主要支援的演算法有des、3des、aes等,這些演算法都可以有效地防止互動資料被破解。

對稱金鑰演算法要求解密金鑰和加密金鑰完全一致。因此,利用對稱金鑰演算法加密傳輸資料之前,需要在通訊兩端部署相同的金鑰。

3. 訊息完整性驗證

為了避免網路中傳輸的資料被非法篡改,ssl利用基於md5或sha的mac演算法來保證訊息的完整性。

mac演算法是在金鑰參與下的資料摘要演算法,能將金鑰和任意長度的資料轉換為固定長度的資料。利用mac演算法驗證訊息完整性的過程如下圖所示。

傳送者在金鑰的參與下,利用mac演算法計算出訊息的mac值,並將其加在訊息之後傳送給接收者。接收者利用同樣的金鑰和mac演算法計算出訊息的mac值,並與接收到的mac值比較。如果二者相同,則報文沒有改變;否則,報文在傳輸過程中被修改,接收者將丟棄該報文。

訊息完整性驗證.png

mac演算法要求通訊雙方具有相同的金鑰,否則mac值驗證將會失敗。因此,利用mac演算法驗證訊息完整性之前,需要在通訊兩端部署相同的金鑰。

4.利用非對稱金鑰演算法保證金鑰本身的安全

對稱金鑰演算法和mac演算法要求通訊雙方具有相同的金鑰,否則解密或mac值驗證將失敗。因此,要建立加密通道或驗證訊息完整性,必須先在通訊雙方部署一致的金鑰。

ssl利用非對稱金鑰演算法加密金鑰的方法實現金鑰交換,保證第三方無法獲取該金鑰。如下圖所示,ssl客戶端(如web瀏覽器)利用ssl伺服器(如web伺服器)的公鑰加密金鑰,將加密後的金鑰傳送給ssl伺服器,只有擁有對應私鑰的ssl伺服器才能從密文中獲取原始的金鑰。ssl通常採用rsa演算法加密傳輸金鑰。(server端公鑰加密金鑰,私鑰解密金鑰)

利用非對稱金鑰演算法保證金鑰本身的安全.png

實際上,ssl客戶端傳送給ssl伺服器的金鑰不能直接用來加密資料或計算mac值,該金鑰是用來計算對稱金鑰和mac金鑰的資訊,稱為premaster secret。

ssl客戶端和ssl伺服器利用premaster secret計算出相同的主金鑰(master secret),再利用master secret生成用於對稱金鑰演算法、mac演算法等的金鑰。

premaster secret是計算對稱金鑰、mac演算法金鑰的關鍵。

5.利用pki保證公鑰的真實性

pki通過數字證書來發布使用者的公鑰,並提供了驗證公鑰真實性的機制。數字證書(簡稱證書)是乙個包含使用者的公鑰及其身份資訊的檔案,證明了使用者與公鑰的關聯。數字證書由權威機構——ca簽發,並由ca保證數字證書的真實性。

ssl客戶端把金鑰加密傳遞給ssl伺服器之前,ssl伺服器需要將從ca獲取的證書傳送給ssl客戶端,ssl客戶端通過pki判斷該證書的真實性。如果該證書確實屬於ssl伺服器,則利用該證書中的公鑰加密金鑰,傳送給ssl伺服器。

驗證ssl伺服器/ssl客戶端的身份之前,ssl伺服器/ssl客戶端需要將從ca獲取的證書傳送給對端,對端通過pki判斷該證書的真實性。如果該證書確實屬於ssl伺服器/ssl客戶端,則對端利用該證書中的公鑰驗證ssl伺服器/ssl客戶端的身份。

1.分層結構

ssl位於應用層和傳輸層之間,它可以為任何基於tcp等可靠連線的應用層協議提供安全性保證。ssl協議本身分為兩層:

ssl協議分層結構.png

其中:2.基本執行過程

"握手階段"涉及四次通訊,該階段的所有通訊都是明文的。

1.客戶端發出請求(clienthello)

2.伺服器回應(severhello)

除了上面這些資訊,如果伺服器需要確認客戶端的身份,就會再包含一項請求,要求客戶端提供"客戶端證書"。比如,金融機構往往只允許認證客戶連入自己的網路,就會向正式客戶提供usb金鑰,裡面就包含了一張客戶端證書。

3.客戶端回應

客戶端收到伺服器回應以後,首先驗證伺服器證書。如果證書不是可信機構頒布、或者證書中的網域名稱與實際網域名稱不一致、或者證書已經過期,就會向訪問者顯示乙個警告,由其選擇是否還要繼續通訊。如果證書沒有問題,客戶端就會從證書中取出伺服器的公鑰。然後,向伺服器傳送下面三項資訊。

上面第一項的隨機數,是整個握手階段出現的第三個隨機數,又稱"pre-master key"。有了它以後,客戶端和伺服器就同時有了三個隨機數,接著雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話金鑰"。

4.伺服器的最後回應

伺服器收到客戶端的第三個隨機數pre-master key之後,計算生成本次會話所用的"會話金鑰"。然後,向客戶端最後傳送下面資訊。

至此,整個握手階段全部結束。接下來,客戶端與伺服器進入加密通訊,就完全是使用普通的http協議,只不過用"會話金鑰"加密內容。

1.ssl/tls協議的基本思路

ssl/tls協議的基本思路是採用公鑰加密法,也就是說,客戶端先向伺服器端索要公鑰,然後用公鑰加密資訊,伺服器收到密文後,用自己的私鑰解密。

2.公鑰加密計算量太大,如何減少耗用的時間?

每一次對話(session),客戶端和伺服器端都生成乙個"對話金鑰"(session key),用它來加密資訊。由於"對話金鑰"是對稱加密,所以運算速度非常快,而伺服器公鑰只用於加密"對話金鑰"本身,這樣就減少了加密運算的消耗時間。

3.為什麼一定要用三個隨機數,來生成"會話金鑰"?

"不管是客戶端還是伺服器,都需要隨機數,這樣生成的金鑰才不會每次都一樣。由於ssl協議中證書是靜態的,因此十分有必要引入一種隨機因素來保證協商出來的金鑰的隨機性。對於rsa金鑰交換演算法來說,pre-master-key本身就是乙個隨機數,再加上hello訊息中的隨機,三個隨機數通過乙個金鑰匯出器最終匯出乙個對稱金鑰。pre master的存在在於ssl協議不信任每個主機都能產生完全隨機的隨機數,如果隨機數不隨機,那麼pre master secret就有可能被猜出來,那麼僅適用pre master secret作為金鑰就不合適了,因此必須引入新的隨機因素,那麼客戶端和伺服器加上pre master secret三個隨機數一同生成的金鑰就不容易被猜出了,乙個偽隨機可能完全不隨機,可是是三個偽隨機就十分接近隨機了,每增加乙個自由度,隨機性增加的可不是一。"

一起學習Mysql Mysql的複製原理

一起學習mysql 系列,對於開發過程中對mysql的優化最重要的節點在前面幾篇文章中提到了一些,不過還是需要不斷的總結和思考,才可以更好的優化mysql。本篇文章,下面就簡單的說一下mysql關於複製的一些知識點,如果有更好的見解,可以一起討論 mysql的複製即增加一台mysql例項,和主庫進行...

開源一起學習

要想自己學習機器學習,3本 聖經 是一定要看的 花書,西瓜書,和統計學習方法 但不是剛入門就要看的,首先啊,我們必須學好學校教的c語言,對程式設計有乙個初步的了解,其次,我們都知道python的厲害,可以幹很多事,也很出名,這就出現了人人都知道py,但不是人人都懂py的現象。確實要想搞機器學習,你最...

一起學習extjs( )

可以說,extjs是系統類專案最好的ui 前端使用者介面 選擇,特別是自從extjs4.0出來後,不管是 美觀還是效能的提高,及其功能之強大,說它排第一,無可厚非。當然,最近也蠻流行easyui這個輕量級的,據說是國人開發的ui。其實,也是很不錯的。大家可以根據自己專案的情況來進行選擇。然後,我們自...