7 張圖帶你搞懂 HTTP 和 HTTPS 的區(qū)別!
1HTTP 協(xié)議簡介
????? 面試官:你先簡單介紹一下 HTTP 協(xié)議 吧!
????? 大白:HTTP 協(xié)議,全稱超文本傳輸協(xié)議(Hypertext Transfer Protocol)。顧名思義,HTTP 協(xié)議就是用來規(guī)范超文本的傳輸,超文本,也就是網(wǎng)絡(luò)上的包括文本在內(nèi)的各式各樣的消,具體來說,主要是來規(guī)范瀏覽器和服務(wù)器端的行為的。另外,HTTP 是一個(gè)無狀態(tài)(stateless)協(xié)議。
????? 面試官:無狀態(tài)協(xié)議這個(gè)如何理解?
????? 大白:也就是說服務(wù)器不維護(hù)任何有關(guān)客戶端過去所發(fā)請(qǐng)求的消息。這其實(shí)是一種懶政,有狀態(tài)協(xié)議會(huì)更加復(fù)雜,需要維護(hù)狀態(tài)(歷史信息),而且如果客戶或服務(wù)器失效,會(huì)產(chǎn)生狀態(tài)的不一致,解決這種不一致的代價(jià)更高。
????? 面試官:HTTP 協(xié)議有哪些優(yōu)點(diǎn)?
????? 大白:HTTP 的主要優(yōu)點(diǎn)有:擴(kuò)展性強(qiáng)、速度快、跨平臺(tái)支持性好。
????? 面試官:HTTP 屬于哪一層的協(xié)議啊?
????? 大白:HTTP 是應(yīng)用層協(xié)議,他以 TCP(傳輸層)作為底層協(xié)議,默認(rèn)端口為 80.
????? 面試官:HTTP 通信過程能簡單介紹一下不?
????? 大白:HTTP 通信過程主要如下:
- 服務(wù)器在 80 端口等待客戶的請(qǐng)求
- 瀏覽器發(fā)起到服務(wù)器的 TCP 連接(創(chuàng)建套接字 Socket)
- 服務(wù)器接收來自瀏覽器的 TCP 連接
- 瀏覽器(HTTP 客戶端)與 Web 服務(wù)器(HTTP 服務(wù)器)交換 HTTP 消息
- 關(guān)閉 TCP 連接
2HTTPS 協(xié)議簡介
????? 面試官:簡單介紹一下 HTTPS 協(xié)議吧!
????? 大白:HTTPS 協(xié)議(Hyper Text Transfer Protocol Secure),是 HTTP 的加強(qiáng)安全版本。HTTPS 是基于 HTTP 的,也是用 TCP 作為底層協(xié)議,并額外使用 SSL/TLS 協(xié)議用作加密和安全認(rèn)證。默認(rèn)端口號(hào)是 443. HTTPS 協(xié)議中,SSL 通道通常使用基于密鑰的加密算法,密鑰長度通常是 40 比特或 128 比特。
????? 面試官:HTTPS 協(xié)議有哪些優(yōu)點(diǎn)?
????? 大白:HTTPS 的主要優(yōu)點(diǎn)有:保密性好、信任度高。正因?yàn)樵诓煌男枨髨鼍跋?HTTP 和 HTTPS 各有優(yōu)點(diǎn),即便是 HTTPS 彌補(bǔ)了 HTTP 前輩保密性差的缺陷,HTTP 也仍然占據(jù)著互聯(lián)網(wǎng)的主流,和 HTTPS 各司其職。事實(shí)上,現(xiàn)在一些健壯性比較好的站點(diǎn),同時(shí)具備了 HTTP 和 HTTPS,當(dāng)訪問 http 前綴的某網(wǎng)站時(shí),會(huì)自動(dòng)跳轉(zhuǎn)到 https 上,已實(shí)現(xiàn)高保密性、高信任的要求。
3HTTPS 的核心協(xié)議——SSL/TLS
HTTPS 之所以能達(dá)到較高的安全性要求,就是結(jié)合了 SSL/TLS 和 TCP 協(xié)議,對(duì)通信數(shù)據(jù)進(jìn)行加密,解決了 HTTP 數(shù)據(jù)透明的問題。接下來重點(diǎn)介紹一下 SSL/TLS 的工作原理。
????? 面試官:SSL 和 TLS 的區(qū)別?
????? 大白:SSL 和 TLS 沒有太大的區(qū)別。SSL 指安全套接字協(xié)議(Secure Sockets Layer),首次發(fā)布與 1996 年。SSL 的首次發(fā)布其實(shí)已經(jīng)是他的 3.0 版本,SSL 1.0 從未面世,SSL 2.0 則具有較大的缺陷(DROWN 缺陷——Decrypting RSA with Obsolete and Weakened eNcryption)。很快,在 1999 年,SSL 3.0 進(jìn)一步升級(jí),新版本被命名為 TLS 1.0。因此,TLS 是基于 SSL 之上的,但由于習(xí)慣叫法,通常把 HTTPS 中的核心加密協(xié)議混成為 SSL/TLS。
非對(duì)稱加密
????? 面試官:SSL/TLS 的核心要素是非對(duì)稱加密,簡單介紹一下吧!
????? 大白:非對(duì)稱加密采用兩個(gè)密鑰——一個(gè)公鑰,一個(gè)私鑰。在通信時(shí),私鑰僅由解密者保存,公鑰由任何一個(gè)想與解密者通信的發(fā)送者(加密者)所知。可以設(shè)想一個(gè)場景,
在某個(gè)自助郵局,每個(gè)通信信道都是一個(gè)郵箱,每一個(gè)郵箱所有者都在旁邊立了一個(gè)牌子,上面掛著一把鑰匙:這是我的公鑰,發(fā)送者請(qǐng)將信件放入我的郵箱,并用公鑰鎖好。
但是公鑰只能加鎖,并不能解鎖。解鎖只能由郵箱的所有者——因?yàn)橹挥兴4嬷借€。
這樣,通信信息就不會(huì)被其他人截獲了,這依賴于私鑰的保密性。
非對(duì)稱加密的公鑰和私鑰需要采用一種復(fù)雜的數(shù)學(xué)機(jī)制生成(密碼學(xué)認(rèn)為,為了較高的安全性,盡量不要自己創(chuàng)造加密方案)。公私鑰對(duì)的生成算法依賴于單向陷門函數(shù)。
單向函數(shù):已知單向函數(shù) f,給定任意一個(gè)輸入 x,易計(jì)算輸出 y=f(x);而給定一個(gè)輸出 y,假設(shè)存在 f(x)=y,很難根據(jù) f 來計(jì)算出 x。
單向陷門函數(shù):一個(gè)較弱的單向函數(shù)。已知單向陷門函數(shù) f,陷門 h,給定任意一個(gè)輸入 x,易計(jì)算出輸出 y=f(x;h);而給定一個(gè)輸出 y,假設(shè)存在 f(x;h)=y,很難根據(jù) f 來計(jì)算出 x,但可以根據(jù) f 和 h 來推導(dǎo)出 x。
單向函數(shù)
上圖就是一個(gè)單向函數(shù)(不是單項(xiàng)陷門函數(shù)),假設(shè)有一個(gè)絕世秘籍,任何知道了這個(gè)秘籍的人都可以把蘋果汁榨成蘋果,那么這個(gè)秘籍就是“陷門”了吧。
在這里,函數(shù) f 的計(jì)算方法相當(dāng)于公鑰,陷門 h 相當(dāng)于私鑰。公鑰 f 是公開的,任何人對(duì)已有輸入,都可以用 f 加密,而要想根據(jù)加密信息還原出原信息,必須要有私鑰才行。
對(duì)稱加密
????? 面試官 :使用 SSL/TLS 進(jìn)行通信的雙方需要使用非對(duì)稱加密方案來通信,但是非對(duì)稱加密設(shè)計(jì)了較為復(fù)雜的數(shù)學(xué)算法,在實(shí)際通信過程中,計(jì)算的代價(jià)較高,效率太低,因此,SSL/TLS 實(shí)際對(duì)消息的加密使用的是對(duì)稱加密。
????? 面試官 :簡單介紹一下對(duì)稱加密吧!
????? 大白:對(duì)稱加密中,通信雙方共享唯一密鑰 k,加解密算法已知,加密方利用密鑰 k 加密,解密方利用密鑰 k 解密,保密性依賴于密鑰 k 的保密性。
對(duì)稱加密的密鑰生成代價(jià)比公私鑰對(duì)的生成代價(jià)低得多,那么有的人會(huì)問了,為什么 SSL/TLS 還需要使用非對(duì)稱加密呢?因?yàn)閷?duì)稱加密的保密性完全依賴于密鑰的保密性。在雙方通信之前,需要商量一個(gè)用于對(duì)稱加密的密鑰。我們知道網(wǎng)絡(luò)通信的信道是不安全的,傳輸報(bào)文對(duì)任何人是可見的,密鑰的交換肯定不能直接在網(wǎng)絡(luò)信道中傳輸。因此,使用非對(duì)稱加密,對(duì)對(duì)稱加密的密鑰進(jìn)行加密,保護(hù)該密鑰不在網(wǎng)絡(luò)信道中被竊聽。這樣,通信雙方只需要一次非對(duì)稱加密,交換對(duì)稱加密的密鑰,在之后的信息通信中,使用絕對(duì)安全的密鑰,對(duì)信息進(jìn)行對(duì)稱加密,即可保證傳輸消息的保密性。
公鑰傳輸?shù)男刨囆?/h3>
????? 面試官 :這樣會(huì)不會(huì)有什么安全隱患呢?
????? 大白:當(dāng)然!設(shè)想一個(gè)下面的場景:
客戶端 C 和服務(wù)器 S 想要使用 SSL/TLS 通信,由上述 SSL/TLS 通信原理,C 需要先知道 S 的公鑰,而 S 公鑰的唯一獲取途徑,就是把 S 公鑰在網(wǎng)絡(luò)信道中傳輸。要注意網(wǎng)絡(luò)信道通信中有幾個(gè)前提:
任何人都可以捕獲通信包
通信包的保密性由發(fā)送者設(shè)計(jì)
保密算法設(shè)計(jì)方案默認(rèn)為公開,而(解密)密鑰默認(rèn)是安全的
因此,假設(shè) S 公鑰不做加密,在信道中傳輸,那么很有可能存在一個(gè)攻擊者 A,發(fā)送給 C 一個(gè)詐包,假裝是 S 公鑰,其實(shí)是誘餌服務(wù)器 AS 的公鑰。當(dāng) C 收獲了 AS 的公鑰(卻以為是 S 的公鑰),C 后續(xù)就會(huì)使用 AS 公鑰對(duì)數(shù)據(jù)進(jìn)行加密,并在公開信道傳輸,那么 A 將捕獲這些加密包,用 AS 的私鑰解密,就截獲了 C 本要給 S 發(fā)送的內(nèi)容,而 C 和 S 二人全然不知。
同樣的,S 公鑰即使做加密,也難以避免這種信任性問題,C 被 AS 拐跑了!
為了公鑰傳輸?shù)男刨囆詥栴},第三方機(jī)構(gòu)應(yīng)運(yùn)而生——證書頒發(fā)機(jī)構(gòu)(CA,Certificate Authority)。CA 默認(rèn)是受信任的第三方。CA 會(huì)給各個(gè)服務(wù)器頒發(fā)證書,證書存儲(chǔ)在服務(wù)器上,并附有 CA 的電子簽名(見下節(jié))。
當(dāng)客戶端(瀏覽器)向服務(wù)器發(fā)送 HTTPS 請(qǐng)求時(shí),一定要先獲取目標(biāo)服務(wù)器的證書,并根據(jù)證書上的信息,檢驗(yàn)證書的合法性。一旦客戶端檢測到證書非法,就會(huì)發(fā)生錯(cuò)誤。客戶端獲取了服務(wù)器的證書后,由于證書的信任性是由第三方信賴機(jī)構(gòu)認(rèn)證的,而證書上又包含著服務(wù)器的公鑰信息,客戶端就可以放心的信任證書上的公鑰就是目標(biāo)服務(wù)器的公鑰。
數(shù)字簽名
????? 面試官 :上面提到了數(shù)字簽名,能簡單介紹一下數(shù)字簽名解決的問題么?
????? 大白:數(shù)字簽名要解決的問題,是防止證書被偽造。第三方信賴機(jī)構(gòu) CA 之所以能被信賴,就是靠數(shù)字簽名技術(shù)。
數(shù)字簽名,是 CA 在給服務(wù)器頒發(fā)證書時(shí),使用散列+加密的組合技術(shù),在證書上蓋個(gè)章,以此來提供驗(yàn)偽的功能。具體行為如下:
CA 知道服務(wù)器的公鑰,對(duì)該公鑰采用散列技術(shù)生成一個(gè)摘要。CA 使用 CA 私鑰對(duì)該摘要進(jìn)行加密,并附在證書下方,發(fā)送給服務(wù)器。
現(xiàn)在服務(wù)器將該證書發(fā)送給客戶端,客戶端需要驗(yàn)證該證書的身份。客戶端找到第三方機(jī)構(gòu) CA,獲知 CA 的公鑰,并用 CA 公鑰對(duì)證書的簽名進(jìn)行解密,獲得了 CA 生成的摘要。
客戶端對(duì)證書數(shù)據(jù)(也就是服務(wù)器的公鑰)做相同的散列處理,得到摘要,并將該摘要與之前從簽名中解碼出的摘要做對(duì)比,如果相同,則身份驗(yàn)證成功;否則驗(yàn)證失敗。
注意,驗(yàn)證身份的證書一定是由 CA 的公鑰進(jìn)行簽名,而不能由發(fā)送者自己來簽名。這是為了抵抗以下的攻擊場景:
攻擊者使用某種手段,欺騙了客戶端,將服務(wù)器的公鑰替換為攻擊者的誘餌公鑰。
假使證書的簽名使用的是服務(wù)器的私鑰,那么客戶端在解碼的時(shí)候,將會(huì)使用假的服務(wù)器公鑰(實(shí)則為誘餌公鑰)。那么,如果該證書實(shí)則由攻擊者(使用自己的私鑰簽名)發(fā)出,那么客戶端就會(huì)成功驗(yàn)證(攻擊者的)身份為真,從而信賴了證書中的公鑰。
如果使用 CA 的私鑰和公鑰來對(duì)簽名處理,則不會(huì)出現(xiàn)上述問題。
總結(jié)來說,帶有證書的公鑰傳輸機(jī)制如下:
- 設(shè)有服務(wù)器 S,客戶端 C,和第三方信賴機(jī)構(gòu) CA。
- S 信任 CA,CA 是知道 S 公鑰的,S 向 CA 頒發(fā)證書。并附上 CA 私鑰對(duì)消息摘要的加密簽名。
- S 獲得 CA 頒發(fā)的證書,將該證書傳遞給 C。
- C 獲得 S 的證書,信任 CA 并知曉 CA 公鑰,使用 CA 公鑰對(duì) S 證書山的簽名解密,同時(shí)對(duì)消息進(jìn)行散列處理,得到摘要。比較摘要,驗(yàn)證 S 證書的真實(shí)性。
- 如果 C 驗(yàn)證 S 證書是真實(shí)的,則信任 S 的公鑰(在 S 證書中)。
4HTTP 和 HTTPS 的區(qū)別
????? 面試官:最后總結(jié)一下 HTTP 和 HTTPS 的區(qū)別吧!
????? 大白:為了幫助區(qū)分 HTTP 和 HTTPS 的區(qū)別,我專門匯總了一張表格: