問題
- 在現代的互聯網中HTTP協議走的都是明文很容易在網絡的傳輸中被人截取數據包,獲取到數據內容。如果涉及到重要的信息,不想讓第三方獲取到數據怎么辦。
- HTTPS怎么對數據加密的,怎么和服務器交互數據
HTTPS簡介
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。
HTTPS數據包在網絡中傳遞過程
服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸的數據都是加密后的數據。具體是如何進行加密,解密,驗證的,且看下圖。
Https連接過程
連接過程說明
- 客戶端發起HTTPS請求
這個沒什么好說的,就是用戶在瀏覽器里輸入一個https網址,然后連接到server的443端口。 - 服務端的配置
采用HTTPS協議的服務器必須要有一套數字證書,可以自己制作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然后發給你,因為只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。 - 傳送證書
這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。 - 客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨機值。然后用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
驗證公鑰有效后,會生成一個對稱加密的密鑰。然后通過服務器給的公鑰加密生成的對稱加密的密鑰發給服務器。 - 傳送加密信息
這部分傳送的是用證書加密后的隨機值,目的就是讓服務端得到這個隨機值,以后客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。
把對稱加密的密鑰發給服務器 - 服務段解密信息
服務端用私鑰解密后,得到了客戶端傳過來的隨機值(密鑰),然后把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠復雜,數據就夠安全。 - 傳輸加密后的信息
這部分信息是服務段用私鑰加密后的信息,可以在客戶端被還原 - 客戶端解密信息
客戶端用之前生成的私鑰解密服務段傳過來的信息,于是獲取了解密后的內容。整個過程第三方即使監聽到了數據,也束手無策。
問題:為什么抓包工具還能抓到HTTPS數據包并解密成功呢?不是說HTTPS在網絡中傳輸的是密文嗎?這個問題就是中間者攻擊(man in zhe middle)
攻擊原理
中間者攻擊原理圖
解決辦法,就是HTTPS單向驗證
在客戶端中內置服務器公鑰,在第三步服務器返回的公鑰,除了驗證公鑰的有效性之外,再比對公鑰是不是和內置的公鑰一樣,不一樣說明被中間者攻擊了,就斷開鏈接不在請求了。
這個原理的前提是服務器的私鑰沒有泄露,客戶端的代碼不會被破解,道高一尺魔高一丈。信息安全就是在合理的范圍內,選擇比較合適的加密方法,沒有絕對論,只有相對論。在某個范圍內比較安全。。
問題服務器要驗證客戶端呢,不是什么人都可以鏈接服務器。怎么辦?
解決辦法,HTTPS雙向認證
如何選擇單向認證還是雙向認證
- 一般一個站點很多用戶訪問就用單向認證
- 企業接口對接就用雙向認證