http存在的隱患
HTTP是屬于應(yīng)用層的協(xié)議,它是基于TCP/IP的,所以它只是規(guī)定一些要傳輸?shù)膬?nèi)容,以及頭部信息,然后通過(guò)TCP協(xié)議進(jìn)行傳輸,依靠IP協(xié)議進(jìn)行尋址,通過(guò)一幅最簡(jiǎn)單的圖來(lái)描述:

客戶(hù)端發(fā)出請(qǐng)求,服務(wù)端進(jìn)行響應(yīng),就是這么簡(jiǎn)單。在整個(gè)過(guò)程中,沒(méi)有任何加密的東西,所以它是不安全的,中間人可以進(jìn)行攔截,獲取傳輸和響應(yīng)的數(shù)據(jù),造成數(shù)據(jù)泄露。
對(duì)稱(chēng)加密
對(duì)于這種情況,我們想到的最直接的辦法就是對(duì)數(shù)據(jù)加密

這種加密方式叫做:對(duì)稱(chēng)加密。 加密和解密用同一個(gè)秘鑰的加密方式叫做對(duì)稱(chēng)加密。但是對(duì)稱(chēng)加密卻解決不了任何問(wèn)題,比如
多個(gè)客戶(hù)端怎么辦?

為所有的客戶(hù)端都應(yīng)用同一個(gè)秘鑰A,這種方式很顯然是不合理的,破解了一個(gè)用戶(hù),所有的用戶(hù)信息都會(huì)被盜取。
但是如果每個(gè)客戶(hù)端 都準(zhǔn)備一個(gè)密鑰也不是很現(xiàn)實(shí),服務(wù)端需要維護(hù)的太多。
另外對(duì)稱(chēng)加密還存在一個(gè)問(wèn)題就是對(duì)稱(chēng)加密的秘鑰也需要傳輸,如果在傳輸秘鑰的過(guò)程中被攔截,秘鑰也會(huì)被獲取,也是非常不安全的
非對(duì)稱(chēng)加密
在對(duì)稱(chēng)加密的路上走不通了,我們換個(gè)思路,還有一種加密方式叫非對(duì)稱(chēng)加密,比如RSA。 非對(duì)稱(chēng)加密會(huì)有一對(duì)秘鑰:公鑰和私鑰。 公鑰加密的內(nèi)容,只有私鑰可以解開(kāi),私鑰加密的內(nèi)容,所有的公鑰都可以解開(kāi)(當(dāng)然是指和秘鑰是一對(duì)的公鑰)。

私鑰只保存在服務(wù)器端,公鑰可以發(fā)送給所有的客戶(hù)端。
在傳輸公鑰的過(guò)程中,肯定也會(huì)有被中間人獲取的風(fēng)險(xiǎn),但在目前的情況下,至少可以保證客戶(hù)端通過(guò)公鑰加密的內(nèi)容,中間人是無(wú)法破解的,因?yàn)樗借€只保存在服務(wù)器端,只有私鑰可以破解公鑰加密的內(nèi)容。
現(xiàn)在我們還存在一個(gè)問(wèn)題,如果公鑰被中間人拿到篡改呢:
MITM:Man-in-the-MiddleAttack

客戶(hù)端拿到的公鑰是假的,如何解決這個(gè)問(wèn)題?
第三方認(rèn)證
公鑰被掉包,是因?yàn)榭蛻?hù)端無(wú)法分辨?zhèn)骰毓€的到底是中間人,還是服務(wù)器,這也是密碼學(xué)中的身份驗(yàn)證問(wèn)題。
在HTTPS中,使用 證書(shū) + 數(shù)字簽名 來(lái)解決這個(gè)問(wèn)題。

這里假設(shè)加密方式是MD5,將網(wǎng)站的信息加密后通過(guò)第三方機(jī)構(gòu)的私鑰再次進(jìn)行加密,生成數(shù)字簽名。
數(shù)字證書(shū) = 網(wǎng)站信息 + 數(shù)字簽名
假如中間人攔截后把服務(wù)器的公鑰替換為自己的公鑰,因?yàn)閿?shù)字簽名的存在,會(huì)導(dǎo)致客戶(hù)端驗(yàn)證簽名不匹配,這樣就防止了中間人替換公鑰的問(wèn)題。

瀏覽器安裝后會(huì)內(nèi)置一些權(quán)威第三方認(rèn)證機(jī)構(gòu)的公鑰,比如VeriSign、Symantec以及GlobalSign等等,驗(yàn)證簽名的時(shí)候直接就從本地拿到相應(yīng)第三方機(jī)構(gòu)的公鑰,對(duì)私鑰加密后的數(shù)字簽名進(jìn)行解密得到真正的簽名,然后客戶(hù)端利用簽名生成規(guī)則進(jìn)行簽名生成,看兩個(gè)簽名是否匹配,如果匹配認(rèn)證通過(guò),不匹配則獲取證書(shū)失敗。
為什么要有簽名?
大家可以想一下,為什么要有數(shù)字簽名這個(gè)東西呢?
第三方認(rèn)證機(jī)構(gòu)是一個(gè)開(kāi)放的平臺(tái),我們可以去申請(qǐng),中間人也可以去申請(qǐng)呀:

如果沒(méi)有簽名,只對(duì)網(wǎng)站信息進(jìn)行第三方機(jī)構(gòu)私鑰加密的話,會(huì)存在下面的問(wèn)題:

因?yàn)闆](méi)有認(rèn)證,所以中間人也向第三方認(rèn)證機(jī)構(gòu)進(jìn)行申請(qǐng),然后攔截后把所有的信息都替換成自己的,客戶(hù)端仍然可以解密,并且無(wú)法判斷這是服務(wù)器的還是中間人的,最后造成數(shù)據(jù)泄露。
對(duì)稱(chēng)加密
在安全的拿到服務(wù)器的公鑰之后,客戶(hù)端會(huì)隨機(jī)生成一個(gè)對(duì)稱(chēng)秘鑰,使用服務(wù)器公鑰加密,傳輸給服務(wù)端,此后,相關(guān)的 Application Data 就通過(guò)這個(gè)隨機(jī)生成的對(duì)稱(chēng)秘鑰進(jìn)行加密/解密,服務(wù)器也通過(guò)該對(duì)稱(chēng)秘鑰進(jìn)行解密/加密:

整體流程圖
HTTPS = HTTP + TLS/SSL

HTTPS中具體的內(nèi)容還有很多,可以通過(guò)下圖做一個(gè)參考:

總結(jié)
HTTPS就是使用SSL/TLS協(xié)議進(jìn)行加密傳輸,讓客戶(hù)端拿到服務(wù)器的公鑰,然后客戶(hù)端隨機(jī)生成一個(gè)對(duì)稱(chēng)加密的秘鑰,使用公鑰加密,傳輸給服務(wù)端,后續(xù)的所有信息都通過(guò)該對(duì)稱(chēng)秘鑰進(jìn)行加密解密,完成整個(gè)HTTPS的流程。
<article class="_2rhmJa" style="box-sizing: border-box; display: block; font-weight: 400; line-height: 1.8; margin-bottom: 20px; word-break: break-word; color: rgb(64, 64, 64); font-family: Georgia, "Times New Roman", Times, "Songti SC", serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
關(guān)注公眾號(hào) 程序員小飯(programmer_grow), 更多技術(shù)干貨 面試經(jīng)驗(yàn) 等你來(lái)拿