小程序開發

上海小程序開發 > 小程序動態 > 一次安全可靠的通信——HTTPS原理

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

編輯時間:05-23 09:22 瀏覽次數:20

我們知道小程序的wx.request網絡接口只支持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算法:完整性

來一張完整的圖:

一次可靠的通信

免責聲明:我司網站轉載此文,不代表本網的觀點和立場。不以盈利為目的,如有侵犯公司或個人權益,我司會第一時間刪除文章,歡迎咨詢免費獲取思維導圖!
    相關閱讀
感受專業服務,從來電咨詢開始
15821967367158-2196-7367
cache
Processed in 0.003479 Second.
浙江20选5几点开奖