面試官讓我白話一下HTTPS,用一句話就說(shuō)清楚了
1.從加密算法說(shuō)起
非對(duì)稱加密:
簡(jiǎn)單說(shuō)一句話:公鑰加密的密文只能用私鑰解密,私鑰加密的密文只能用公鑰解密。
私鑰可以生成公鑰,但是公鑰幾乎無(wú)法反推出公鑰。

舉個(gè)例子:
任意想一個(gè)3位數(shù),并把這個(gè)數(shù)和91相乘,然后告訴我積的最后三位數(shù),我就可以猜出對(duì)方想的是什么數(shù)字!
比如123,計(jì)算出123 * 91等于11193,并把結(jié)果的末三位193告訴我。
這時(shí)候我只需要把對(duì)應(yīng)的結(jié)果再乘以11,乘積的末三位就是剛開(kāi)始想的數(shù)了。可以驗(yàn)證一下,193 * 11 = 2123 =》 123
原理非常簡(jiǎn)單,91乘以11等于1001,而任何一個(gè)三位數(shù)乘以1001后,末三位都不變。(當(dāng)然隨便你用2001、3001 只要你可以因式分解開(kāi))
根據(jù)這個(gè)原理,我們可以構(gòu)造一個(gè)加密數(shù)值更大的加密解密系統(tǒng)。比方說(shuō),任意一個(gè)數(shù)乘以10000000001后,后10位都不會(huì)變,然后用計(jì)算機(jī)對(duì)10000000001進(jìn)行因式分解,一個(gè)十位不對(duì)稱加密系統(tǒng)就構(gòu)造好了。
對(duì)稱加密
加密、解密使用的相同的密鑰,常見(jiàn)對(duì)稱加密DES、AES等
小結(jié)
對(duì)稱加密相比非對(duì)稱加密算法來(lái)說(shuō),加解密的效率要高得多、加密速度快。但是缺陷在于對(duì)于密鑰的管理和分發(fā)上比較困難,不是非常安全,密鑰容易被丟失或者竊取。相對(duì)來(lái)說(shuō)非對(duì)稱加密只公開(kāi)公鑰,自己保管私鑰會(huì)更加安全。
2.HTTPS原理
HTTP協(xié)議的缺點(diǎn)
- 明文通信-內(nèi)容會(huì)被監(jiān)聽(tīng)
- 不驗(yàn)證通信方身份-可能會(huì)遭遇偽裝
- 不驗(yàn)證內(nèi)容的完整性-內(nèi)容被篡改
HTTPS 簡(jiǎn)介
HTTPS 協(xié)議(HyperText Transfer Protocol over Seure Socket Layer)可以理解為 HTTPS = HTTP + SSL/TLS,通過(guò)SSL/TLS來(lái)增加HTTP的安全性。

SSL(TLS)
SSL(Secure Socket Layer,安全套接字層):1994年為 Netscape 所研發(fā),SSL 協(xié)議位于 TCP/IP 協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。
TLS(Transport Layer Security,傳輸層安全):其前身是 SSL,它最初的幾個(gè)版本(SSL 1.0、SSL 2.0、SSL 3.0)由網(wǎng)景公司開(kāi)發(fā),1999年從 3.1 開(kāi)始被 IETF 標(biāo)準(zhǔn)化并改名,發(fā)展至今已經(jīng)有 TLS 1.0、TLS 1.1、TLS 1.2 三個(gè)版本。SSL3.0和TLS1.0由于存在安全漏洞,已經(jīng)很少被使用到。TLS 1.3 改動(dòng)會(huì)比較大,目前還在草案階段,目前使用最廣泛的是TLS 1.1、TLS 1.2。
證書
為什么需要第三方頒發(fā)證書?
服務(wù)端向客戶端發(fā)送的公鑰依舊會(huì)被劫持,傳輸內(nèi)容依舊會(huì)被解密。劫持者可以用自己的私鑰生成一把新的公鑰,修改內(nèi)容后用自己的私鑰進(jìn)行加密,再把修改后的內(nèi)容以及自己生成的公鑰發(fā)送給客戶端。所以需要引入第三方機(jī)構(gòu)頒發(fā)證書。

3.一次完整的HTTPS通信
一句話概括
通過(guò)數(shù)字證書和非對(duì)稱加密建立SSL連接,生成并傳遞對(duì)稱加密所使用的的密鑰。后續(xù)的HTTP通信就使用對(duì)稱加密來(lái)保護(hù)內(nèi)容。保證安全的同時(shí)也提高了效率。
- 客戶端第一次向服務(wù)端進(jìn)行請(qǐng)求建立SSL連接。
- 服務(wù)端返回CA頒發(fā)的數(shù)字證書,其中也包含了非對(duì)稱加密的密鑰。
- 與服務(wù)端建立連接以后,客戶端會(huì)發(fā)送一個(gè)隨機(jī)密碼串稱為Pre-master secret(用公鑰加密) - 此時(shí)該密碼串只有服務(wù)端可以解密
- 服務(wù)端通過(guò)私鑰解密出Pre-master secret,并通過(guò)一定算法計(jì)算出對(duì)稱加密(一般是AES算法)的密鑰master (客戶端也會(huì)用同樣的算法計(jì)算這個(gè)master)
- SSL連接建立成功,進(jìn)行HTTP通信,并使用AES 對(duì)稱算法對(duì)內(nèi)容進(jìn)行加解密。

4.HTTPS一定安全嗎
HTTPS 的數(shù)據(jù)是加密的,常規(guī)下抓包工具代理請(qǐng)求后抓到的包內(nèi)容是加密狀態(tài),無(wú)法直接查看。
但是,只要客戶端授權(quán)的情況下,便可以組建中間人網(wǎng)絡(luò),而抓包工具便是作為中間人的代理。
通常 HTTPS 抓包工具(Charles)的使用方法是會(huì)生成一個(gè)證書,用戶需要手動(dòng)把證書安裝到客戶端中,然后終端發(fā)起的所有請(qǐng)求通過(guò)該證書完成與抓包工具的交互,然后抓包工具再轉(zhuǎn)發(fā)請(qǐng)求到服務(wù)器,最后把服務(wù)器返回的結(jié)果在控制臺(tái)輸出后再返回給終端,從而完成整個(gè)請(qǐng)求的閉環(huán)。
HTTPS 可以防止用戶在不知情的情況下通信鏈路被監(jiān)聽(tīng),對(duì)于主動(dòng)授信的抓包操作是不提供防護(hù)的,因?yàn)檫@個(gè)場(chǎng)景用戶是已經(jīng)對(duì)風(fēng)險(xiǎn)知情。要防止被抓包,需要采用應(yīng)用級(jí)的安全防護(hù),例如采用私有的對(duì)稱加密,同時(shí)做好移動(dòng)端的防反編譯加固,防止本地算法被破解。