Https是如何保證通訊安全的

  • 這個問題困擾了很久,最近看了資料,總結一番,總結不到位的地方還請指出
  • http是明文傳輸而https加密傳輸(http的發展歷史及各版本的差異,報文頭這裏就不介紹了,有興趣的同學自己查閱資料)這是它們最大的區別。那https是如何達到安全傳輸的呢,這個需要先了解下http與https的osi層次結構(圖來源《圖解http》)

image.png

很明顯https 是在tcp與http之間添加了一層ssl(Secure Sockets Layer)層,俗稱安全套接層

  • SSL釋義:請參看這裏博文,有詳細講解:
    https://www.jianshu.com/p/6c981b44293d
  • 理解https的安全傳輸需要先了解兩種加密算法,因爲在整個https通訊過程使用兩種加密算法,一種非對稱加密算法,另一種對稱加密算法
  • 非對稱加密算法:這種加密或許理解起來比較困難,這種加密指的是可以生成一對密鑰 (k1, k2)。凡是 k1 加密的數據,k1 自身不能解密,而需要 k2 才能解密;凡是 k2 加密的數據,k2 不能解密,需要 k1 才能解密。這種算法事實上有很多,常用的是 RSA,其基於的數學原理是兩個大素數的乘積很容易算,而拿到這個乘積去算出是哪兩個素數相乘就很複雜了。好在以目前的技術,分解大數的素因數確實比較困難,尤其是當這個大數足夠大的時候(通常使用2的10次方個二進制位這麼大),就算是超級計算機解密也需要非常長的時間
  • 對稱加密算法簡單來說就是加密與解密使用的密鑰是一樣的。

有了這兩種算法做基礎之後對後面的內容就好理解了。我們現在來一步一步揭開https的面紗。
先假設有兩臺計算機需要通信,它們的情況大致是這樣:
image.png
如果不進行加密傳輸,裸傳就是http傳輸了,很容易被攔截。假設計算A與計算機B之間約定使用Key1=(20202020liuhulai)這個密鑰對報文內容進行加解密,即發送方使用key1對待發送的內容進行加密處理,接收方使用key1對接收過來的內容進行解密處理,看似已經達到了安全傳輸的效果,但如何保證計算機A安全的將key1發送給計算機B呢?如果這個階段被攔截了那麼key1就被泄露了,別人就可以假冒發送方 計算機A 向接收方 計算機B 發送信息了,還是沒達到安全傳輸的效果。現在問題是需要保證key1能夠安全在網絡上傳輸,很明顯不能再使用對稱加密來保護這個key1的安全傳輸了,聰明的人類於是引入了非對稱加密:

這種方法就是,讓客戶端和服務器都擁有兩把鑰匙,一把鑰匙是公開的(全世界知道都沒關係),我們稱之爲公鑰;另一把鑰匙則是保密的(只有自己本人才知道),我們稱之爲私鑰。並且用公鑰加密的數據,只有對應的私鑰才能解密;用私鑰加密的數據,只有對應的公鑰才能解密。

於是按照這種方法來保證key1在網絡上的安全傳輸,它的過程大致如下圖:
image.png

這種方式貌似已經達到了,但是在第一步計算機B明文傳輸自己的公鑰時又存在泄露的風險,被人攔截之後使用假冒的的公鑰假設爲key2,發送給計算機A,接着計算機A收到這個報文之後,使用key2對 key1 再進行加密傳輸,中間人攔截到這個報文之後使用自己的私鑰進行解密得到key1,然後再僞造一個key1_1通過計算機B的公鑰發送給計算機B,於是計算A與計算機B整個通訊過程都暴露在中間人眼皮底下,無異於裸奔,這種現象就是中間人攻擊。

image.png

導致這個問題的根本原因是計算A無法知道這個公鑰是否來自計算機B。

科學是向前發展的,充滿智慧的人類總是能克服一個一個困難。因此,我們需要找到一種策略來證明這把公鑰就是服務器的,而不是別人冒充的。我們需要找到一個擁有公信力、大家都認可的認證中心(CA)。於是就誕生了數字證書。它的具體過程是這樣的:
計算機B在給計算機A傳輸公鑰的過程中,會把公鑰以及個人信息通過Hash算法生成信息摘要。如圖:
image.png
爲了防止信息摘要也被人調換,計算機B還會用CA提供的私鑰對信息摘要進行加密來形成數字簽名。如圖:
image.png

並且,最後還會把原來沒Hash算法之前的個人信息以及公鑰 和 數字簽名合併在一起,形成數字證書(回想下在使用https通信時是不是需要內置一份證書文件)。當計算機A拿到這份數字證書之後,就會用CA提供的公鑰來對數字證書裏面的數字簽名進行解密來得到信息摘要,然後對數字證書裏服務器的公鑰以及個人信息進行Hash得到另外一份信息摘要。最後把兩份信息摘要進行對比,如果一樣,則證明這個人是服務器,否則就不是。
如圖:

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章