通俗易懂的告訴你,https是如何保證數(shù)據(jù)安全的
HTTP存在的問(wèn)題
竊聽(tīng)風(fēng)險(xiǎn):通信使用明文(不加密),內(nèi)容可能會(huì)被竊聽(tīng)(第三方可能獲知通信內(nèi)容) 冒充風(fēng)險(xiǎn):不驗(yàn)證通信方的身份,因此有可能遭遇偽裝 篡改風(fēng)險(xiǎn):無(wú)法證明報(bào)文的完整性,所以有可能已遭篡改
HTTPS

可以看到 HTTPS的網(wǎng)站,在瀏覽器的地址欄內(nèi)會(huì)出現(xiàn)一個(gè)帶鎖的標(biāo)記。
HTTPS并非是應(yīng)用層一個(gè)新的協(xié)議,通常 HTTP 直接和 TCP 通信,HTTPS則先和安全層(SSL/TLS)通信,然后安全層再和 TCP 層通信。

SSL/TLS協(xié)議就是為了解決上面提到的HTTP存在的問(wèn)題而生的,下面我們來(lái)看一下它是怎么解決的:
所有的信息都是加密傳輸?shù)模谌綗o(wú)法竊聽(tīng) 配備身份驗(yàn)證,防止身份被冒充 具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方會(huì)立刻發(fā)現(xiàn)
加密
對(duì)稱加密
加密和解密同用一個(gè)秘鑰的方式稱為 共享秘鑰加密,也被叫做對(duì)稱秘鑰加密。

瀏覽器發(fā)送給服務(wù)端 client_random和一系列加密方法服務(wù)端發(fā)送給瀏覽器 server_random和加密方法
現(xiàn)有瀏覽器和服務(wù)器有了三個(gè)相同的憑證:client_random、server_random和加密方法
用加密方法把 client_random、server_random 兩個(gè)隨機(jī)數(shù)混合起來(lái),生成秘鑰,這個(gè)密鑰就是瀏覽器和服務(wù)端通信的暗號(hào)。
存在的問(wèn)題:第三方可以在中間獲取到client_random、server_random和加密方法,由于這個(gè)加密方法同時(shí)可以解密,所以中間人可以成功對(duì)暗號(hào)進(jìn)行解密,拿到數(shù)據(jù),很容易就將這種加密方式破解了。
非對(duì)稱加密

瀏覽器發(fā)送給服務(wù)端 一系列加密方法 服務(wù)端發(fā)送給瀏覽器 加密方法以及公鑰
之后瀏覽器通過(guò)公鑰將數(shù)據(jù)加密傳輸給服務(wù)端,服務(wù)端收到數(shù)據(jù)使用私鑰進(jìn)行解密。服務(wù)端給瀏覽器發(fā)送數(shù)據(jù),則使用私鑰進(jìn)行加密,瀏覽器收到服務(wù)端發(fā)送過(guò)來(lái)的數(shù)據(jù),使用公鑰進(jìn)行解密。
存在的問(wèn)題:
非對(duì)稱加密效率太低, 這會(huì)嚴(yán)重影響加解密的速度,進(jìn)而影響到用戶打開(kāi)頁(yè)面的速度。 無(wú)法保證服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)安全, 服務(wù)器的數(shù)據(jù)只能用私鑰進(jìn)行加密(因?yàn)槿绻霉€那么瀏覽器也沒(méi)法解密啦),中間人一旦拿到公鑰,那么就可以對(duì)服務(wù)端傳來(lái)的數(shù)據(jù)進(jìn)行解密了,就這樣又被破解了。
HTTPS使用對(duì)稱加密和非對(duì)稱加密結(jié)合
傳輸數(shù)據(jù)階段依然使用對(duì)稱加密,但是對(duì)稱加密的秘鑰我們采用非對(duì)稱加密傳輸。

瀏覽器向服務(wù)器發(fā)送client_random和加密方法列表。 服務(wù)器接收到,返回server_random、加密方法以及公鑰。 瀏覽器接收,接著生成另一個(gè)隨機(jī)數(shù)pre_master, 并且用公鑰加密,傳給服務(wù)器。(重點(diǎn)操作!) 服務(wù)器用私鑰解密這個(gè)被加密后的pre_master。
到此為止,服務(wù)器和瀏覽器就有了相同的 ?client_random、server_random 和 pre_master, 然后服務(wù)器和瀏覽器會(huì)使用這三組隨機(jī)數(shù)生成對(duì)稱秘鑰。有了對(duì)稱秘鑰之后,雙方就可以使用對(duì)稱加密的方式來(lái)傳輸數(shù)據(jù)了。
CA (數(shù)字證書)
使用對(duì)稱和非對(duì)稱混合的方式,實(shí)現(xiàn)了數(shù)據(jù)的加密傳輸。但是這種仍然存在一個(gè)問(wèn)題,服務(wù)器可能是被黑客冒充的。這樣,瀏覽器訪問(wèn)的就是黑客的服務(wù)器,黑客可以在自己的服務(wù)器上實(shí)現(xiàn)公鑰和私鑰,而對(duì)瀏覽器來(lái)說(shuō),它并不完全知道現(xiàn)在訪問(wèn)的是這個(gè)是黑客的站點(diǎn)。
服務(wù)器需要證明自己的身份,需要使用權(quán)威機(jī)構(gòu)頒發(fā)的證書,這個(gè)權(quán)威機(jī)構(gòu)就是 CA(Certificate Authority), 頒發(fā)的證書就稱為數(shù)字證書 (Digital Certificate)。
對(duì)于瀏覽器來(lái)說(shuō),數(shù)字證書有兩個(gè)作用:
通過(guò)數(shù)字證書向?yàn)g覽器證明服務(wù)器的身份 數(shù)字證書里面包含了服務(wù)器公鑰
下面我們來(lái)看一下含有數(shù)字證書的HTTPS的請(qǐng)求流程

相對(duì)于不含數(shù)字證書的HTTPS請(qǐng)求流程,主要以下兩點(diǎn)改動(dòng)
服務(wù)器沒(méi)有直接返回公鑰給瀏覽器,而是返回了數(shù)字證書,而公鑰正是包含數(shù)字證書中的; 在瀏覽器端多了一個(gè)證書驗(yàn)證的操作,驗(yàn)證了證書之后,才繼續(xù)后序流程。
參考
如何用通俗易懂的話來(lái)解釋非對(duì)稱加密?[1] 十分鐘搞懂HTTP和HTTPS協(xié)議?[2] HTTPS 原理分析——帶著疑問(wèn)層層深入[3] 圖解HTTP[4] 瀏覽器工作原理與實(shí)踐[5]
參考資料
如何用通俗易懂的話來(lái)解釋非對(duì)稱加密?: https://www.zhihu.com/question/33645891
[2]十分鐘搞懂HTTP和HTTPS協(xié)議?: https://zhuanlan.zhihu.com/p/72616216
[3]HTTPS 原理分析——帶著疑問(wèn)層層深入: https://www.cnblogs.com/leap/p/11953836.html
[4]圖解HTTP: https://book.douban.com/subject/25863515/
[5]瀏覽器工作原理與實(shí)踐: https://time.geekbang.org/column/article/156181
本公眾號(hào)將抽獎(jiǎng)送出?5?本??《Node.js+Express+Vue.js項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)》,感謝機(jī)械工業(yè)出版社的贊助~

