一次安全可靠的通信——HTTPS原理

爲什麼HTTPS協議就比HTTP安全呢?一次安全可靠的通信應該包含什麼東西呢,這篇文章我會嘗試講清楚這些細節。

Alice與Bob的通信

我們以Alice與Bob一次通信來貫穿全文,一開始他們都是用明文的形式在網絡傳輸通信內容。

Alice與Bob通信

嗅探以及篡改

如果在他們的通信鏈路出現了一個Hacker,由於通信內容都是明文可見,所以Hacker可以嗅探看到這些內容,也可以篡改這些內容。

嗅探與篡改

公衆號的文章之前就遇到很多被挾持篡改了內容,插入廣告。

公衆號文章挾持案例

 

加密解密

既然明文有問題,那就需要對明文進行加密處理,讓中間人看不懂內容,於是乎要對原來的內容變成一段看不懂的內容,稱爲加密,反之則是解密。而本質其實就是一種數學運算的逆運算,類似加法減法,例如發送方可以將 abcd…xyz 每個字母+1映射成 bcd…yza,使得原文的字母變成看不懂的序列,而接收方只需要將每個字母-1就可以恢復成原來的序列,當然這種做法規律太容易被破解了,後邊會有個案例示意圖。

加密解密的本質

 

對稱加密

如果對2個二進制數A和B進行異或運算得到結果C, 那C和B再異或一次就會回到A,所以異或也可以作爲加密解密的運算。

XOR運算

 把操作數A作爲明文,操作數B作爲密鑰,結果C作爲密文。可以看到加密解密運用同一個密鑰B,把這種加解密都用同一個密鑰的方式叫做對稱加密。

對稱加密

可以看到簡單的異或加密/解密操作,需要密鑰跟明文位數相同。爲了克服這個缺點,需要改進一下,把明文進行分組,每組長度跟密鑰一致,分別做異或操作就可以得到密文分片,再合併到一起就得到密文了。

對稱加密-分組

但是這種簡單分組的模式也是很容易發現規律,可以從下圖看到,中間採用對原圖進行DES的ECB模式加密(就是上邊提到簡單分組的模式)

容易破解VS不容易破解的模式

很明顯,原圖一些特徵在加密後還是暴露無遺,因此需要再改進一把。一般的思路就是將上次分組運算的結果/中間結果參與到下次分組的運算中去,使得更隨機混亂,更難破解。以下圖片來自維基百科:

對稱加密-模式

經過改良後,Alice與Bob如果能提前拿到一個對稱加密的密鑰,他們就可以通過加密明文來保證他們說話內容不會被Hacker看到了。

Alice與Bob採用對稱加密方式通信

非對稱加密

剛剛還引發另一個問題,這個對稱加密用到的密鑰怎麼互相告知呢?如果在傳輸真正的數據之前,先把密鑰傳過去,那Hacker還是能嗅探到,那之後就了無祕密了。於是乎出現另外一種手段:

危險的環境下傳遞密鑰

這就是非對稱加密,任何人都可以通過拿到Bob公開的公鑰對內容進行加密,然後只有Bob自己私有的鑰匙才能解密還原出原來內容。

非對稱加密

RSA就是這樣一個算法,具體數學證明利用了大質數乘法難以分解、費馬小定理等數學理論支撐它難以破解。相對於前邊的對稱加密來說,其需要做乘法模除等操作,性能效率比對稱加密差很多。

RSA

由於非對稱加密的性能低,因此我們用它來先協商對稱加密的密鑰即可,後續真正通信的內容還是用對稱加密的手段,提高整體的性能。

優化Alice與Bob的通信

認證

上邊雖然解決了密鑰配送的問題,但是中間人還是可以欺騙雙方,只要在Alice像Bob要公鑰的時候,Hacker把自己公鑰給了Alice,而Alice是不知道這個事情的,以爲一直都是Bob跟她在通信。

中間人欺騙

要怎麼證明現在傳過來的公鑰就是Bob給的呢?在危險的網絡環境下,還是沒有解決這個問題。

怎麼證明公鑰就是Bob的

一般我們現實生活是怎麼證明Bob就是Bob呢?一般都是政府給我們每個人發一個身份證(假設身份證沒法僞造),我只要看到Bob身份證,就證明Bob就是Bob。
網絡也可以這麼做,如果有個大家都信任的組織CA給每個人出證明,那Alice只要拿到這個證明,檢查一下是不是CA製作的Bob證書就可以證明Bob是Bob。所以這個證書裏邊需要有兩個重要的東西:Bob的公鑰+CA做的數字簽名。

可信組織

前邊說到用公鑰進行加密,只有擁有私鑰的人才能解密。數字證書有點反過來:用私鑰進行加密,用公鑰進行解密。CA用自己的私鑰對Bob的信息(包含Bob公鑰)進行加密,由於Alice無條件信任CA,所以已經提前知道CA的公鑰,當她收到Bob證書的時候,只要用CA的公鑰對Bob證書內容進行解密,發現能否成功解開(還需要校驗完整性),此時說明Bob就是Bob,那之後用證書裏邊的Bob公鑰來走之前的流程,就解決了中間人欺騙這個問題了。
這種方式也是一種防抵賴的方式,讓對方把消息做一個數字簽名,只要我收到消息,用對方的公鑰成功解開校驗這個簽名,說明這個消息必然是對方發給我的,對方不可以抵賴這個行爲,因爲只有他才擁有做數字簽名的私鑰。

內置根CA簽名公鑰

CA其實是有多級關係,頂層有個根CA,只要他信任B,B信任C,C信任D,那我們基本就可以認爲D是可信的。

證書信任鏈

完整性

上邊基本上已經解決了保密性和認證,還有一個完整性沒有保障。雖然Hacker還是看不懂內容,但是Hacker可以隨便篡改通信內容的幾個bit位,此時Bob解密看到的可能是很亂的內容,但是他也不知道這個究竟是Alice真實發的內容,還是被別人偷偷改了的內容。

Alice你在說什麼?

單向Hash函數可以把輸入變成一個定長的輸出串,其特點就是無法從這個輸出還原回輸入內容,並且不同的輸入幾乎不可能產生相同的輸出,即便你要特意去找也非常難找到這樣的輸入(抗碰撞性),因此Alice只要將明文內容做一個Hash運算得到一個Hash值,並一起加密傳遞過去給Bob。Hacker即便篡改了內容,Bob解密之後發現拿到的內容以及對應計算出來的Hash值與傳遞過來的不一致,說明這個包的完整性被破壞了。
數據完整性

一次安全可靠的通信

總結一下,安全可靠的保障:

  1. 對稱加密以及非對稱加密來解決:保密性
  2. 數字簽名:認證、不可抵賴
  3. 單向Hash算法:完整性

來一張完整的圖:

一次可靠的通信

 文章地址:https://developers.weixin.qq.com/community/develop/article/doc/000046a5fdc7802a15f7508b556413

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