自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:為什么HTTPS是安全的?

開發(fā) 后端
首先先通過對 HTTP 中間人攻擊的來了解到 HTTP 為什么是不安全的,然后再從安全攻防的技術(shù)演變一直到 HTTPS 的原理概括,希望能讓大家對 HTTPS 有個更深刻的了解。

 1. HTTP 協(xié)議

在談?wù)?HTTPS 協(xié)議之前,先來回顧一下 HTTP 協(xié)議的概念。

1.1 HTTP 協(xié)議介紹

HTTP 協(xié)議是一種基于文本的傳輸協(xié)議,它位于 OSI 網(wǎng)絡(luò)模型中的應(yīng)用層。

HTTP 協(xié)議是通過客戶端和服務(wù)器的請求應(yīng)答來進(jìn)行通訊,目前協(xié)議由之前的 RFC 2616 拆分成立六個單獨(dú)的協(xié)議說明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通訊報文如下:

  •  請求 
  1. POST http://www.baidu.com HTTP/1.1  
  2. Host: www.baidu.com  
  3. Connection: keep-alive  
  4. Content-Length: 7  
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36  
  6. wd=HTTP 
  •  響應(yīng) 
  1. HTTP/1.1 200 OK  
  2. Connection: Keep-Alive  
  3. Content-Encoding: gzip  
  4. Content-Type: text/html;charset=utf-8  
  5. Date: Thu, 14 Feb 2019 07:23:49 GMT  
  6. Transfer-Encoding: chunked  
  7. <html>...</html> 

1.2 HTTP 中間人攻擊

HTTP 協(xié)議使用起來確實(shí)非常的方便,但是它存在一個致命的缺點(diǎn):不安全。

我們知道 HTTP 協(xié)議中的報文都是以明文的方式進(jìn)行傳輸,不做任何加密,這樣會導(dǎo)致什么問題呢?下面來舉個例子:

    1.  小明在 JAVA 貼吧發(fā)帖,內(nèi)容為我愛JAVA:    

    2.  被中間人進(jìn)行攻擊,內(nèi)容修改為我愛PHP    

    3.  小明被群嘲(手動狗頭)

可以看到在 HTTP 傳輸過程中,中間人能看到并且修改 HTTP 通訊中所有的請求和響應(yīng)內(nèi)容,所以使用 HTTP 是非常的不安全的。

1.3 防止中間人攻擊

這個時候可能就有人想到了,既然內(nèi)容是明文那我使用對稱加密的方式將報文加密這樣中間人不就看不到明文了嗎,于是如下改造:

    1.  雙方約定加密方式    

    2.  使用 AES 加密報文    

這樣看似中間人獲取不到明文信息了,但其實(shí)在通訊過程中還是會以明文的方式暴露加密方式和秘鑰,如果第一次通信被攔截到了,那么秘鑰就會泄露給中間人,中間人仍然可以解密后續(xù)的通信:

那么對于這種情況,我們肯定就會考慮能不能將秘鑰進(jìn)行加密不讓中間人看到呢?答案是有的,采用非對稱加密,我們可以通過 RSA 算法來實(shí)現(xiàn)。

在約定加密方式的時候由服務(wù)器生成一對公私鑰,服務(wù)器將公鑰返回給客戶端,客戶端本地生成一串秘鑰(AES_KEY)用于對稱加密,并通過服務(wù)器發(fā)送的公鑰進(jìn)行加密得到(AES_KEY_SECRET),之后返回給服務(wù)端,服務(wù)端通過私鑰將客戶端發(fā)送的AES_KEY_SECRET進(jìn)行解密得到AEK_KEY,最后客戶端和服務(wù)器通過AEK_KEY進(jìn)行報文的加密通訊,改造如下:

可以看到這種情況下中間人是竊取不到用于AES加密的秘鑰,所以對于后續(xù)的通訊是肯定無法進(jìn)行解密了,那么這樣做就是絕對安全了嗎?

所謂道高一尺魔高一丈,中間人為了對應(yīng)這種加密方法又想出了一個新的破解方案,既然拿不到AES_KEY,那我就把自己模擬成一個客戶端和服務(wù)器端的結(jié)合體,在用戶->中間人的過程中中間人模擬服務(wù)器的行為,這樣可以拿到用戶請求的明文,在中間人->服務(wù)器的過程中中間人模擬客戶端行為,這樣可以拿到服務(wù)器響應(yīng)的明文,以此來進(jìn)行中間人攻擊:

這一次通信再次被中間人截獲,中間人自己也偽造了一對公私鑰,并將公鑰發(fā)送給用戶以此來竊取客戶端生成的AES_KEY,在拿到AES_KEY之后就能輕松的進(jìn)行解密了。

中間人這樣為所欲為,就沒有辦法制裁下嗎,當(dāng)然有啊,接下來我們看看 HTTPS 是怎么解決通訊安全問題的。

2. HTTPS 協(xié)議

2.1 HTTPS 簡介

HTTPS 其實(shí)是SSL+HTTP的簡稱,當(dāng)然現(xiàn)在SSL基本已經(jīng)被TLS取代了,不過接下來我們還是統(tǒng)一以SSL作為簡稱,SSL協(xié)議其實(shí)不止是應(yīng)用在HTTP協(xié)議上,還在應(yīng)用在各種應(yīng)用層協(xié)議上,例如:FTP、WebSocket。

其實(shí)SSL協(xié)議大致就和上一節(jié)非對稱加密的性質(zhì)一樣,握手的過程中主要也是為了交換秘鑰,然后再通訊過程中使用對稱加密進(jìn)行通訊,大概流程如下:

這里我只是畫了個示意圖,其實(shí)真正的 SSL 握手會比這個復(fù)雜的多,但是性質(zhì)還是差不多,而且我們這里需要關(guān)注的重點(diǎn)在于 HTTPS 是如何防止中間人攻擊的。

通過上圖可以觀察到,服務(wù)器是通過 SSL 證書來傳遞公鑰,客戶端會對 SSL 證書進(jìn)行驗(yàn)證,其中證書認(rèn)證體系就是確保SSL安全的關(guān)鍵,接下來我們就來講解下CA 認(rèn)證體系,看看它是如何防止中間人攻擊的。

2.2 CA 認(rèn)證體系

上一節(jié)我們看到客戶端需要對服務(wù)器返回的 SSL 證書進(jìn)行校驗(yàn),那么客戶端是如何校驗(yàn)服務(wù)器 SSL 證書的安全性呢。

  •  權(quán)威認(rèn)證機(jī)構(gòu)

    在 CA 認(rèn)證體系中,所有的證書都是由權(quán)威機(jī)構(gòu)來頒發(fā),而權(quán)威機(jī)構(gòu)的 CA 證書都是已經(jīng)在操作系統(tǒng)中內(nèi)置的,我們把這些證書稱之為CA根證書:

  •  簽發(fā)證書

 我們的應(yīng)用服務(wù)器如果想要使用 SSL 的話,需要通過權(quán)威認(rèn)證機(jī)構(gòu)來簽發(fā)CA證書,我們將服務(wù)器生成的公鑰和站點(diǎn)相關(guān)信息發(fā)送給CA簽發(fā)機(jī)構(gòu),再由CA簽發(fā)機(jī)構(gòu)通過服務(wù)器發(fā)送的相關(guān)信息用CA簽發(fā)機(jī)構(gòu)進(jìn)行加簽,由此得到我們應(yīng)用服務(wù)器的證書,證書會對應(yīng)的生成證書內(nèi)容的簽名,并將該簽名使用CA簽發(fā)機(jī)構(gòu)的私鑰進(jìn)行加密得到證書指紋,并且與上級證書生成關(guān)系鏈。

這里我們把百度的證書下載下來看看:

可以看到百度是受信于GlobalSign G2,同樣的GlobalSign G2是受信于GlobalSign R1,當(dāng)客戶端(瀏覽器)做證書校驗(yàn)時,會一級一級的向上做檢查,直到最后的根證書,如果沒有問題說明服務(wù)器證書是可以被信任的。

  •  如何驗(yàn)證服務(wù)器證書

那么客戶端(瀏覽器)又是如何對服務(wù)器證書做校驗(yàn)的呢,首先會通過層級關(guān)系找到上級證書,通過上級證書里的公鑰來對服務(wù)器的證書指紋進(jìn)行解密得到簽名(sign1),再通過簽名算法算出服務(wù)器證書的簽名(sign2),通過對比sign1和sign2,如果相等就說明證書是沒有被篡改也不是偽造的。

這里有趣的是,證書校驗(yàn)用的 RSA 是通過私鑰加密證書簽名,公鑰解密來巧妙的驗(yàn)證證書有效性。

這樣通過證書的認(rèn)證體系,我們就可以避免了中間人竊取AES_KEY從而發(fā)起攔截和修改 HTTP 通訊的報文。

總結(jié)

首先先通過對 HTTP 中間人攻擊的來了解到 HTTP 為什么是不安全的,然后再從安全攻防的技術(shù)演變一直到 HTTPS 的原理概括,希望能讓大家對 HTTPS 有個更深刻的了解。 

 

責(zé)任編輯:龐桂玉 來源: JAVA高級架構(gòu)
相關(guān)推薦

2021-05-13 07:58:05

HTTPSHTTP安全

2021-05-12 08:20:53

開發(fā)

2023-12-06 09:10:28

JWT微服務(wù)

2023-12-20 14:35:37

Java虛擬線程

2021-09-07 10:44:33

Java 注解開發(fā)

2022-07-06 13:48:24

RedisSentinel機(jī)制

2024-03-13 07:53:57

弱引用線程工具

2024-01-11 08:12:20

重量級監(jiān)視器

2021-12-08 06:53:29

面試動態(tài)代理

2024-02-22 15:36:23

Java內(nèi)存模型線程

2022-09-29 07:30:57

數(shù)據(jù)庫索引字段

2020-10-24 15:50:54

Java值傳遞代碼

2021-01-21 07:53:29

面試官Promis打印e

2022-12-27 08:39:54

MySQL主鍵索引

2022-02-08 08:14:07

Context數(shù)據(jù)線程

2021-12-20 10:30:33

forforEach前端

2024-11-26 17:43:51

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2023-11-30 08:16:19

SpringjarTomcat

2023-07-05 08:17:38

JDK動態(tài)代理接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號