目錄
- 前言
- HTTPS概述
- 一些需要提前科普的
- TLS/SSL協議
- 對稱加密
- 非對稱加密
- 客觀的理解HTTPS工作的每個過程
- 如何保證安全傳輸?
- 對稱加密的算法(祕鑰)如何確定?
- 如何安全的協商加密的算法(祕鑰)?
- 使用公鑰加密協商一定是安全的?
- 如何保證公鑰發佈者的身份?
- HTTPS實際的工作過程
- HTTPS到底做了什麼?
- 參考資料
前言
HTTPS現在幾乎已經無人不知無人不曉。
各大手機平臺也相繼要求使用HTTPS進行請求。
問起什麼是HTTPS、所有人都會回答《安全》。
那麼、HTTPS是如何做到安全的。這是本篇想要談的東西。
HTTPS概述
隨着HTTP的應用越來越廣泛、一些問題便隨之而來。
其中首當其衝的就是安全性、例如:
1. 竊聽風險
由於HTTP本身並不具備加密屬性、所有的信息都等於在互聯網上裸奔。
2. 身份僞裝
用戶不知道自己的需求是否發送給了目標服務器、有可能被釣魚。
HTTPS、正致力於解決這些安全性問題。
一些需要提前科普的
-
TLS/SSL協議
TLS/SSL協議提供了身份驗證、信息加密和完整性校驗的功能。
說白點,就是在明文的上層和TCP層之間加上一層加密,這樣就保證上層信息傳輸的安全
-
對稱加密
HTTPS在正常傳輸時、使用的對稱加密算法、保證傳輸效率。
如圖、對稱加密中A/B雙方都持有相同的祕鑰。發送數據時加密、接收數據時解密。
-
非對稱加密
HTTPS在握手時使用非對稱加密、保證協商私鑰時的私密性。
如圖、B持有(無數個)鎖、每次發送數據時都把數據鎖好。A接到盒子後、用手裏的鑰匙解密。
這樣做的好處是、即使客戶端B的鎖泄漏了、攻擊者也無法獲知真正的信息、因爲他並沒法解密。
如果想更多的瞭解對稱/非對稱加密、強推李永樂老師的科普視頻《B站鏈接》
客觀的理解HTTPS工作的每個過程
這裏、我先不從網上覆制HTTPS的工作過程、因爲感覺並不好理解。
而是通過一些問題以及解決方案來嘗試更好的理解HTTPS爲什麼這麼設計。
-
如何保證安全傳輸?
既然HTTPS的關鍵是安全傳輸、那麼什麼是安全。
讓第三者無法攔截?這在物理上暫時不可實現。(當然不排除未來的可能性、但那時也就不需要HTTPS了)
所以我們退而求其次:
讓第三者即使截獲、也
無法解密(獲得)
裏面的真正內容。
我們只要利用之前提到的《對稱加密》的方式、就可以達到這個效果。
-
對稱加密的算法(祕鑰)如何確定?
如果客戶端都用同一個私鑰、自然不可能。
試想、你會將你的密碼公佈給100個人麼?只要其中一個人泄漏了你的祕鑰、將會滿盤皆輸。
我們希望服務器與每一個人的加密算法、都是不固定的。
但服務器再和每個用戶協商算法的時候、依舊沒有加密、仍舊存在被截獲的危險。
-
如何安全的協商加密的算法(祕鑰)?
這裏需要引出剛纔提到的另一個加密算法:《非對稱加密》。
忘了的同學可以翻上去重新看一下、套用到HTTPS裏是這樣:
- 服務器自己持有私鑰
- 服務器將公鑰分發給所有想要與自己鏈接的用戶
- 用戶將
加密的核心算法用公鑰加密
之後傳給服務器 - 服務器
用私鑰對加密的核心算法進行解密
並確認使用該算法。
經過這個步驟、我們達成了以下效果
由
每個客戶
通過安全渠道確定
加密的不同核心算法
-
使用公鑰加密協商一定是安全的?
上面我們解決了安全渠道協商算法的問題、但是如果公鑰被篡改了、無異於從一開始就功虧一簣。
如上圖所示、紅色的祕鑰已經被攻擊者獲得、攻擊者可以隨意解密甚至串改二者的通訊信息。
-
如何保證公鑰發佈者的身份?
其實如果只是一對一、我們完全可以在APP或者瀏覽器預裝服務器的公鑰、讓公鑰不通過網絡傳輸。
但在現實中不可行、因爲域名/服務器太多了、我們預裝不過來。
於是可以轉變一下思路、求助一下有公信力的第三者。
我們需要有一個人告訴我們、服務器發過來的這個私鑰、沒有被篡改。
使用數字簽名的方式進行身份認證
上圖中、藍色部分(公鑰、數字證書
)都是由第三方機構提供
的。公鑰提供給客戶端、數字證書提供給服務器。而紅色部分(數字簽名
)也是在服務器申請證書的時候由第三方機構書寫
。用戶只需要信任第三方機構並集成即可。
當然這裏還有個問題、就是萬一我連證書籤發機構的公鑰
都被篡改了呢?
能做到這一步時、只能說你的客戶端/瀏覽器已經被攻破了、已經不屬於HTTPS保護的範疇了~
HTTPS實際的工作過程
其實理解了之前說的HTTPS設計思路、已經不太需要背這張圖了。
具體每個步驟的數據包、可以參閱《Https原理淺析》
大概有下面幾部:
- 客戶端發送自己支持的加密規則給服務器,代表告訴服務器要進行連接了
- 服務器從中選出一套加密算法和hash算法以及自己的身份信息(地址等)以證書的形式發送給瀏覽器,證書中包含服務器信息,加密公鑰,證書的辦法機構
- 客戶端收到網站的證書之後要做下面的事情:
(1). 驗證證書的合法性
(2). 如果驗證通過證書,瀏覽器會生成一串隨機數,並用證書中的公鑰進行加密
(3). 用約定好的hash算法計算握手消息,然後用生成的密鑰進行加密,然後一起發送給服務器 - 服務器接收到客戶端傳送來的信息,要求下面的事情:
(1). 用私鑰解析出密碼,,用密碼解析握手消息,驗證hash值是否和瀏覽器發來的一致
(2). 使用密鑰加密消息,回送 - 如果計算法hash值一致,握手成功
HTTPS到底做了什麼?
他負責《幫助服務器和客戶端在安全的環境下協商出一個祕鑰》以《進行加密傳輸》。