眾所周知,http協(xié)議是一種未加密的協(xié)議,我們未加密的數(shù)據(jù),在傳輸?shù)倪^程中會經(jīng)過一個又一個的物理節(jié)點(diǎn),如果被人通過抓包的方式拿到了我們的數(shù)據(jù),將會給我們造成無法估量的損失。
為了解決解決這個問題,https應(yīng)運(yùn)而生。https通過加密的手段,保障的數(shù)據(jù)的安全性。那https的怎么加密的呢?這就是我們接下來需要討論的內(nèi)容。
1、對稱加密
什么是對稱加密?
簡單說就是有一個密鑰,它可以加密一段信息,也可以對加密后的信息進(jìn)行解密,和我們?nèi)粘I钪杏玫蔫€匙作用差不多。
比如說小明需要給小紅發(fā)送一條:Hello World,為了保證數(shù)據(jù)安全,小明把所有字母往后移動了一位,發(fā)送時的消息就變成了:Ifmmp Xpsm。
小紅收到消息后,再把字母順序往前移動一位,就得到了Hello World。
這樣,即使攻擊人拿到密文,他不知道怎么解密的密鑰,也無法得到密文內(nèi)容。
- 小明需要給小紅發(fā)送一條:Hello World
- 小明使用對稱加密得到密文Ifmmp Xpsm
- 傳輸密文
- 小紅收到密文,進(jìn)行解密,得到Hello World
使用對稱加密,即使數(shù)據(jù)被截獲,但是他沒有密鑰,他無法得到密文內(nèi)容,也無法修改。
但是對稱加密有一個問題,如何讓雙方都用同一個密鑰進(jìn)行數(shù)據(jù)加密,同時不被別人知道
如果瀏覽器內(nèi)部就預(yù)存了網(wǎng)站A的密鑰,且可以確保除了瀏覽器和網(wǎng)站A,不會有任何外人知道該密鑰,那理論上用對稱加密是可以的,這樣瀏覽器只要預(yù)存好世界上所有HTTPS網(wǎng)站的密鑰就行了!這么做顯然不現(xiàn)實(shí)。
2、非對稱加密
什么是非對稱加密?
簡單說就是有兩把密鑰,通常一把叫做公鑰、一把叫私鑰,用公鑰加密的內(nèi)容必須用私鑰才能解開,同樣,私鑰加密的內(nèi)容只有公鑰能解開。
如何使用非對稱加密呢?
假如,客戶端需要向服務(wù)器發(fā)送一條數(shù)據(jù),瀏覽器需要保障數(shù)據(jù)的安全性,加密流程如下:
- 某網(wǎng)站服務(wù)器擁有公鑰A與對應(yīng)的私鑰A’;客戶端擁有公鑰B與對應(yīng)的私鑰B’。
- 客戶端請求服務(wù)器的公鑰A,公鑰A是公開的,可以明文傳輸
- 客戶端使用公鑰A進(jìn)行加密,將加密的數(shù)據(jù)發(fā)送給服務(wù)器
- 服務(wù)器收到數(shù)據(jù),使用私鑰A`進(jìn)行解密,拿到數(shù)據(jù)
反之,服務(wù)器向客戶端發(fā)送數(shù)據(jù)也是同樣的流程。
非對稱加密算法在解決了雙方交換密鑰的問題,但非對稱加密算法非常耗時,而對稱加密快很多。那我們能不能運(yùn)用非對稱加密的特性解決前面提到的對稱加密的漏洞?
3、非對稱加密+對稱加密
非對稱加密能讓雙方進(jìn)行數(shù)據(jù)交換,但性能不行,對稱加密性能不錯,但是無法確認(rèn)雙方的加密密鑰,那用非對稱加密完成對稱加密的密鑰交換,之后再用對稱加密進(jìn)行加密不就可以了嗎?
流程如下:
- 某網(wǎng)站擁有用于非對稱加密的公鑰A、私鑰A’。
- 瀏覽器向網(wǎng)站服務(wù)器請求,服務(wù)器把公鑰A明文給傳輸瀏覽器。
- 瀏覽器隨機(jī)生成一個用于對稱加密的密鑰X,用公鑰A加密后傳給服務(wù)器。
- 服務(wù)器拿到后用私鑰A’解密得到密鑰X。
- 這樣雙方就都擁有密鑰X了,且別人無法知道它。之后雙方所有數(shù)據(jù)都通過密鑰X加密解密即可。
完美!這樣非對稱加密的性能問題也解決了。
但是,這里面還是有漏洞。
如果在數(shù)據(jù)傳輸過程中,中間人劫持到了數(shù)據(jù),此時他的確無法得到瀏覽器生成的密鑰X,這個密鑰本身被公鑰A加密了,只有服務(wù)器才有私鑰A’解開它,然而中間人卻完全不需要拿到私鑰A’就能干壞事了。請看:
- 某網(wǎng)站有用于非對稱加密的公鑰A、私鑰A’。
- 瀏覽器向網(wǎng)站服務(wù)器請求,服務(wù)器把公鑰A明文給傳輸瀏覽器。
- 中間人劫持到公鑰A,保存下來,把數(shù)據(jù)包中的公鑰A替換成自己偽造的公鑰B(它當(dāng)然也擁有公鑰B對應(yīng)的私鑰B’)。
- 瀏覽器生成一個用于對稱加密的密鑰X,用公鑰B(瀏覽器無法得知公鑰被替換了)加密后傳給服務(wù)器。
- 中間人劫持后用私鑰B’解密得到密鑰X,再用公鑰A加密后傳給服務(wù)器。
- 服務(wù)器拿到后用私鑰A’解密得到密鑰X。
通過這一通操作,攻擊者就知道服務(wù)器和瀏覽器之間的公鑰了,這樣,對稱加密就形同虛設(shè)了。
為什么會發(fā)生這樣的事?因?yàn)闉g覽器拿到公鑰的時候,他無法確定這個公鑰是服務(wù)器的。在傳輸過程中,公鑰被篡改,一方用篡改后的公鑰加密,非對稱加密形同虛設(shè)。
4、數(shù)字證書
如何證明瀏覽器收到的公鑰一定是該網(wǎng)站的公鑰?這個時候,就要引入第三方機(jī)構(gòu)了,也被稱作CA機(jī)構(gòu)。
CA機(jī)構(gòu)怎么解決瀏覽器無法確認(rèn)收到的公鑰是不是網(wǎng)站自己的問題呢?
網(wǎng)站只需要向CA機(jī)構(gòu)申領(lǐng)一份數(shù)字證書,這份證書里面,包括了網(wǎng)站的公鑰,網(wǎng)站的域名和其他一些網(wǎng)站基本信息。
然后CA機(jī)構(gòu)用自己的私鑰對證書進(jìn)行加密,同時生成一段密文,這段密碼就叫做數(shù)字簽名
數(shù)字證書的生成過程如下:
- CA機(jī)構(gòu)擁有非對稱加密的私鑰和公鑰。
- 網(wǎng)站需要申請數(shù)字證書,只需將自己網(wǎng)站的數(shù)據(jù)給CA機(jī)構(gòu)(網(wǎng)站公鑰,網(wǎng)站域名等)
- CA機(jī)構(gòu)對證書明文數(shù)據(jù)進(jìn)行hash。
- 對hash后的值用私鑰加密,得到數(shù)字簽名
證書的內(nèi)容大概長這樣
之后的瀏覽器驗(yàn)證流程如下:
- 拿到證書,從證書中得到公鑰,數(shù)字簽名等數(shù)據(jù)。
- 用CA機(jī)構(gòu)的公鑰對數(shù)字簽名解密(瀏覽器內(nèi)置CA機(jī)構(gòu)的公鑰),得到S。
- 用hash算法對明文進(jìn)行hash得到T。
- 顯然通過以上步驟,T’應(yīng)當(dāng)?shù)扔赟‘,除非明文或簽名被篡改。所以此時比較S’是否等于T’,等于則表明證書可信。如果證書的數(shù)據(jù)沒有被改動過,S和T應(yīng)該是相同的,則證書可信任,瀏覽器就用證書中的公鑰加密數(shù)據(jù)。
- 如果S和T,則說明證書已被篡改,證書不可信,從而終止向服務(wù)器傳輸信息,防止信息泄露給中間人。
** 為什么S和T不一樣,說明證書就被篡改了呢?**
這里是理解證書認(rèn)證的關(guān)鍵,仔細(xì)思考,數(shù)字簽名是用CA機(jī)構(gòu)的私鑰加密的,CA機(jī)構(gòu)的私鑰只有CA機(jī)構(gòu)自己知道,如果證書被中間人劫持,他拿到證書,修改了證書中的公鑰,因?yàn)楣€修改后,數(shù)據(jù)的Hash值,就和數(shù)字簽名解密后的Hash值不同了,瀏覽器就知道證書被動過,而中間人無法偽造數(shù)字簽名,因?yàn)閿?shù)字簽名是用CA機(jī)構(gòu)的私鑰加密的,他要偽造,就必須拿到CA機(jī)構(gòu)的私鑰!
中間人有可能把證書掉包嗎
假設(shè)有另一個網(wǎng)站B也拿到了CA機(jī)構(gòu)認(rèn)證的證書,它想劫持網(wǎng)站A的信息。于是它成為中間人攔截到了A傳給瀏覽器的證書,然后替換成自己的證書,傳給瀏覽器,之后瀏覽器就會錯誤地拿到B的證書里的公鑰了,這確實(shí)會導(dǎo)致上文“中間人攻擊”那里提到的漏洞?
其實(shí)這并不會發(fā)生,因?yàn)樽C書里包含了網(wǎng)站A的信息,包括域名,瀏覽器把證書里的域名與自己請求的域名比對一下就知道有沒有被掉包了。文章來源:http://www.zghlxwxcb.cn/news/detail-790850.html
瀏覽器怎么得到CA機(jī)構(gòu)的公鑰
CA機(jī)構(gòu)的公鑰去通過網(wǎng)絡(luò)獲取,如果通過網(wǎng)絡(luò)去獲取,那CA機(jī)構(gòu)生成的證書就沒意義了。
一般瀏覽器會內(nèi)置主流的CA機(jī)構(gòu)的公鑰。文章來源地址http://www.zghlxwxcb.cn/news/detail-790850.html
到了這里,關(guān)于HTTPS加密原理,搞懂什么是對稱加密、非對稱加密、證書、數(shù)字簽名的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!