為什么HTTPS比HTTP更安全
原創(chuàng)【51CTO.com原創(chuàng)稿件】
前言
近幾年,互聯(lián)網(wǎng)發(fā)生著翻天覆地的變化,尤其是我們一直習(xí)以為常的HTTP協(xié)議,在逐漸的被HTTPS協(xié)議所取代,在瀏覽器、搜索引擎、CA機(jī)構(gòu)、大型互聯(lián)網(wǎng)企業(yè)的共同促進(jìn)下,互聯(lián)網(wǎng)迎來了“HTTPS加密時(shí)代”,HTTPS將在未來的幾年內(nèi)全面取代HTTP成為傳輸協(xié)議的主流。
讀完本文,希望你能明白:
-
HTTP通信存在什么問題
-
HTTPS如何改進(jìn)HTTP存在那些問題
-
HTTPS工作原理是什么
一、為什么需要HTTPS
在HTTP協(xié)議中有可能存在信息竊取或身份偽裝等安全問題。使用HTTPS通信機(jī)制可以有效地防止這些問題,接下來,我們先來了解下HTTP協(xié)議存在的哪些問題:
1.通信使用明文(不加密),內(nèi)容可能被竊聽
由于HTTP本身不具備加密的功能,所以也無法做到對(duì)通信整體(使用HTTP協(xié)議通信的請(qǐng)求和響應(yīng)的內(nèi)容)進(jìn)行加密。即HTTP報(bào)文使用明文(指未經(jīng)過加密的報(bào)文)方式發(fā)送。
此外互聯(lián)網(wǎng)是由聯(lián)通世界各個(gè)地方的網(wǎng)絡(luò)設(shè)施組成,所有發(fā)送和接收經(jīng)過某些設(shè)備的數(shù)據(jù)都可能被截獲或窺視。例如大家都熟悉的抓包工具:Wireshark,它可以獲取HTTP協(xié)議的請(qǐng)求和響應(yīng)的內(nèi)容,并對(duì)其進(jìn)行解析。即使經(jīng)過加密處理,就有可能讓人無法破解報(bào)文信息的含義,但加密處理后的報(bào)文信息本身還是會(huì)被看到的。
2.不驗(yàn)證通信方的身份,因此有可能遭遇偽裝
。在HTTP協(xié)議通信時(shí),由于不存在確認(rèn)通信方的處理步驟,任何人都可以發(fā)起請(qǐng)求。另外,服務(wù)器只要接收到請(qǐng)求,不管對(duì)方是誰都會(huì)返回一個(gè)響應(yīng)(但也僅限于發(fā)送端的IP地址和端口號(hào)沒有被Web服務(wù)器設(shè)定限制訪問的前提下)
HTTP協(xié)議的實(shí)現(xiàn)本身非常簡(jiǎn)單,不論是誰發(fā)送過來的請(qǐng)求都會(huì)返回響應(yīng),因此不確認(rèn)通信方,會(huì)存在以下各種隱患。比如目標(biāo)的Web服務(wù)器有可能是已偽裝的Web服務(wù)器。
3.無法證明報(bào)文的完整性,所以可能遭篡改
所謂完整性是指信息的準(zhǔn)確度。若無法證明其完整性,通常也就意味著無法判斷信息是否準(zhǔn)確。由于HTTP協(xié)議無法證明通信的報(bào)文完整性,因此,在請(qǐng)求或響應(yīng)送出之后直到對(duì)方接收之前的這段時(shí)間內(nèi),即使請(qǐng)求或響應(yīng)的內(nèi)容遭到篡改,也沒有辦法獲悉。換句話說,沒有任何辦法確認(rèn),發(fā)出的請(qǐng)求/響應(yīng)和接收到的請(qǐng)求/響應(yīng)是前后相同的。
二、什么是 HTTPS
HTTPS是在HTTP上建立SSL加密層,并對(duì)傳輸數(shù)據(jù)進(jìn)行加密,是HTTP協(xié)議的安全版?,F(xiàn)在它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。
HTTPS主要作用是:
(1)對(duì)數(shù)據(jù)進(jìn)行加密,并建立一個(gè)信息安全通道,來保證傳輸過程中的數(shù)據(jù)安全;
(2)對(duì)網(wǎng)站服務(wù)器進(jìn)行真實(shí)身份認(rèn)證。
我們經(jīng)常會(huì)在Web的登錄頁面和購(gòu)物結(jié)算界面等使用HTTPS通信。使用HTTPS通信時(shí),不再用http://
,而是改用https://
。另外,當(dāng)瀏覽器訪問HTTPS通信有效的Web網(wǎng)站時(shí),瀏覽器的地址欄內(nèi)會(huì)出現(xiàn)一個(gè)帶鎖的標(biāo)記。對(duì)HTTPS的顯示方式會(huì)因?yàn)g覽器的不同而有所改變。
三、HTTPS如何解決HTTP上述三個(gè)問題?
HTTPS并非是應(yīng)用層的一種新協(xié)議。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)協(xié)議代替而已。
通常,HTTP直接和TCP通信。當(dāng)使用SSL時(shí),則演變成先和SSL通信,再由SSL和TCP通信了。簡(jiǎn)言之,所謂HTTPS,其實(shí)就是身披SSL協(xié)議這層外殼的HTTP。
在采用SSL后,HTTP就擁有了HTTPS的加密、證書和完整性保護(hù)這些功能。也就是說HTTP加上加密處理和認(rèn)證以及完整性保護(hù)后即是HTTPS。
HTTPS 協(xié)議的主要功能基本都依賴于 TLS/SSL 協(xié)議,TLS/SSL 的功能實(shí)現(xiàn)主要依賴于三類基本算法:散列函數(shù) 、對(duì)稱加密和非對(duì)稱加密,其利用非對(duì)稱加密實(shí)現(xiàn)身份認(rèn)證和密鑰協(xié)商,對(duì)稱加密算法采用協(xié)商的密鑰對(duì)數(shù)據(jù)加密,基于散列函數(shù)驗(yàn)證信息的完整性。
(一)解決內(nèi)容可能被竊聽的問題——加密
方法1.對(duì)稱加密
這種方式加密和解密同用一個(gè)密鑰。加密和解密都會(huì)用到密鑰。沒有密鑰就無法對(duì)密碼解密,反過來說,任何人只要持有密鑰就能解密了。
以對(duì)稱加密方式加密時(shí)必須將密鑰也發(fā)給對(duì)方??删烤乖鯓硬拍馨踩剞D(zhuǎn)交?在互聯(lián)網(wǎng)上轉(zhuǎn)發(fā)密鑰時(shí),如果通信被監(jiān)聽那么密鑰就可會(huì)落人攻擊者之手,同時(shí)也就失去了加密的意義。另外還得設(shè)法安全地保管接收到的密鑰。
方法2.非對(duì)稱加密
公開密鑰加密使用一對(duì)非對(duì)稱的密鑰。一把叫做私有密鑰,另一把叫做公開密鑰。顧名思義,私有密鑰不能讓其他任何人知道,而公開密鑰則可以隨意發(fā)布,任何人都可以獲得。
使用公開密鑰加密方式,發(fā)送密文的一方使用對(duì)方的公開密鑰進(jìn)行加密處理,對(duì)方收到被加密的信息后,再使用自己的私有密鑰進(jìn)行解密。利用這種方式,不需要發(fā)送用來解密的私有密鑰,也不必?fù)?dān)心密鑰被攻擊者竊聽而盜走。
非對(duì)稱加密的特點(diǎn)是信息傳輸一對(duì)多,服務(wù)器只需要維持一個(gè)私鑰就能夠和多個(gè)客戶端進(jìn)行加密通信。
這種方式有以下缺點(diǎn):
-
公鑰是公開的,所以針對(duì)私鑰加密的信息,黑客截獲后可以使用公鑰進(jìn)行解密,獲取其中的內(nèi)容;
-
公鑰并不包含服務(wù)器的信息,使用非對(duì)稱加密算法無法確保服務(wù)器身份的合法性,存在中間人攻擊的風(fēng)險(xiǎn),服務(wù)器發(fā)送給客戶端的公鑰可能在傳送過程中被中間人截獲并篡改;
-
使用非對(duì)稱加密在數(shù)據(jù)加密解密過程需要消耗一定時(shí)間,降低了數(shù)據(jù)傳輸效率;
方法3.對(duì)稱加密+非對(duì)稱加密(HTTPS采用這種方式)
使用對(duì)稱密鑰的好處是解密的效率比較快,使用非對(duì)稱密鑰的好處是可以使得傳輸?shù)膬?nèi)容不能被破解,因?yàn)榫退隳銛r截到了數(shù)據(jù),但是沒有對(duì)應(yīng)的私鑰,也是不能破解內(nèi)容的。就比如說你搶到了一個(gè)保險(xiǎn)柜,但是沒有保險(xiǎn)柜的鑰匙也不能打開保險(xiǎn)柜。那我們就將對(duì)稱加密與非對(duì)稱加密結(jié)合起來,充分利用兩者各自的優(yōu)勢(shì),在交換密鑰環(huán)節(jié)使用非對(duì)稱加密方式,之后的建立通信交換報(bào)文階段則使用對(duì)稱加密方式。
具體做法是:發(fā)送密文的一方使用對(duì)方的公鑰進(jìn)行加密處理“對(duì)稱的密鑰”,然后對(duì)方用自己的私鑰解密拿到“對(duì)稱的密鑰”,這樣可以確保交換的密鑰是安全的前提下,使用對(duì)稱加密方式進(jìn)行通信。所以,HTTPS采用對(duì)稱加密和非對(duì)稱加密兩者并用的混合加密機(jī)制。
(二)解決通信方身份可能被偽裝的問題——數(shù)字證書
非對(duì)稱加密方式還是存在一些問題的。那就是無法證明公開密鑰本身就是貨真價(jià)實(shí)的公開密鑰。比如,正準(zhǔn)備和某臺(tái)服務(wù)器建立公開密鑰加密方式下的通信時(shí),如何證明收到的公開密鑰就是原本預(yù)想的那臺(tái)服務(wù)器發(fā)行的公開密鑰。 為了解決上述問題,可以使用由數(shù)字證書認(rèn)證機(jī)構(gòu)(CA,Certificate Authority)和其相關(guān)機(jī)關(guān)頒發(fā)的公開密鑰證書。
數(shù)字證書認(rèn)證機(jī)構(gòu)處于客戶端與服務(wù)器雙方都可信賴的第三方機(jī)構(gòu)的立場(chǎng)上。我們來介紹一下數(shù)字證書認(rèn)證機(jī)構(gòu)的業(yè)務(wù)流程。首先,服務(wù)器的運(yùn)營(yíng)人員向數(shù)字證書認(rèn)證機(jī)構(gòu)提出公開密鑰的申請(qǐng)。數(shù)字證書認(rèn)證機(jī)構(gòu)在判明提出申請(qǐng)者的身份之后,會(huì)對(duì)已申請(qǐng)的公開密鑰做數(shù)字簽名,然后分配這個(gè)已簽名的公開密鑰,并將該公開密鑰放入公鑰證書后綁定在一起。 服務(wù)器會(huì)將這份由數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā)的公鑰證書發(fā)送給客戶端,以進(jìn)行非對(duì)稱加密方式通信。公鑰證書也可叫做數(shù)字證書或直接稱為證書。
接到證書的客戶端可使用數(shù)字證書認(rèn)證機(jī)構(gòu)的公開密鑰,對(duì)那張證書上的數(shù)字簽名進(jìn)行驗(yàn)證,一旦驗(yàn)證通過,客戶端便可明確兩件事:一,認(rèn)證服務(wù)器的公開密鑰的是真實(shí)有效的數(shù)字證書認(rèn)證機(jī)構(gòu)。二,服務(wù)器的公開密鑰是值得信賴的。
(三)解決報(bào)文可能遭篡改問題——數(shù)字簽名
網(wǎng)絡(luò)傳輸過程中需要經(jīng)過很多中間節(jié)點(diǎn),雖然數(shù)據(jù)無法被解密,但可能被篡改,那如何校驗(yàn)數(shù)據(jù)的完整性呢?----校驗(yàn)數(shù)字簽名。
數(shù)字簽名有兩種功效:
-
能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來的,因?yàn)閯e人假冒不了發(fā)送方的簽名。
-
數(shù)字簽名能確定消息的完整性,證明數(shù)據(jù)是否未被篡改過。
校驗(yàn)數(shù)字簽名流程見下圖:
數(shù)字簽名技術(shù)就是對(duì)“非對(duì)稱密鑰加解密”和“數(shù)字摘要“兩項(xiàng)技術(shù)的應(yīng)用,它將摘要信息用發(fā)送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對(duì)收到的原文產(chǎn)生一個(gè)摘要信息,與解密的摘要信息對(duì)比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數(shù)字簽名能夠驗(yàn)證信息的完整性。
四、 HTTPS工作流程
1.Client發(fā)起一個(gè)HTTPS(https:/demo.linianhui.dev)的請(qǐng)求,根據(jù)RFC2818的規(guī)定,Client知道需要連接Server的443(默認(rèn))端口。
2.Server把事先配置好的公鑰證書(public key certificate)返回給客戶端。
3.Client驗(yàn)證公鑰證書:比如是否在有效期內(nèi),證書的用途是不是匹配Client請(qǐng)求的站點(diǎn),是不是在CRL吊銷列表里面,它的上一級(jí)證書是否有效,這是一個(gè)遞歸的過程,直到驗(yàn)證到根證書(操作系統(tǒng)內(nèi)置的Root證書或者Client內(nèi)置的Root證書)。如果驗(yàn)證通過則繼續(xù),不通過則顯示警告信息。
4.Client使用偽隨機(jī)數(shù)生成器生成加密所使用的會(huì)話密鑰,然后用證書的公鑰加密這個(gè)會(huì)話密鑰,發(fā)給Server。
5.Server使用自己的私鑰(private key)解密這個(gè)消息,得到會(huì)話密鑰。至此,Client和Server雙方都持有了相同的會(huì)話密鑰。
6.Server使用會(huì)話密鑰加密“明文內(nèi)容A”,發(fā)送給Client。
7.Client使用會(huì)話密鑰解密響應(yīng)的密文,得到“明文內(nèi)容A”。
8.Client再次發(fā)起HTTPS的請(qǐng)求,使用會(huì)話密鑰加密請(qǐng)求的“明文內(nèi)容B”,然后Server使用會(huì)話密鑰解密密文,得到“明文內(nèi)容B”。
五、HTTP 與 HTTPS 的區(qū)別
-
HTTP 是明文傳輸協(xié)議,HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比 HTTP 協(xié)議安全。
關(guān)于安全性,用最簡(jiǎn)單的比喻形容兩者的關(guān)系就是卡車運(yùn)貨,HTTP下的運(yùn)貨車是敞篷的,貨物都是暴露的。而https則是封閉集裝箱車,安全性自然提升不少。
-
HTTPS比HTTP更加安全,對(duì)搜索引擎更友好,利于SEO,谷歌、百度優(yōu)先索引HTTPS網(wǎng)頁;
-
HTTPS需要用到SSL證書,而HTTP不用;
-
HTTPS標(biāo)準(zhǔn)端口443,HTTP標(biāo)準(zhǔn)端口80;
-
HTTPS基于傳輸層,HTTP基于應(yīng)用層;
-
HTTPS在瀏覽器顯示綠色安全鎖,HTTP沒有顯示。
六、為何不所有的網(wǎng)站都使用HTTPS
既然HTTPS那么安全可靠,那為何不所有的Web網(wǎng)站都使用HTTPS?
首先,很多人還是會(huì)覺得HTTPS實(shí)施有門檻,這個(gè)門檻在于需要權(quán)威CA頒發(fā)的SSL證書。從證書的選擇、購(gòu)買到部署,傳統(tǒng)的模式下都會(huì)比較耗時(shí)耗力。
其次,HTTPS普遍認(rèn)為性能消耗要大于HTTP,因?yàn)?/span>與純文本通信相比,加密通信會(huì)消耗更多的CPU及內(nèi)存資源。如果每次通信都加密,會(huì)消耗相當(dāng)多的資源,平攤到一臺(tái)計(jì)算機(jī)上時(shí),能夠處理的請(qǐng)求數(shù)量必定也會(huì)隨之減少。但事實(shí)并非如此,用戶可以通過性能優(yōu)化、把證書部署在SLB或CDN,來解決此問題。舉個(gè)實(shí)際的例子,“雙十一”期間,全站HTTPS的淘寶、天貓依然保證了網(wǎng)站和移動(dòng)端的訪問、瀏覽、交易等操作的順暢、平滑。通過測(cè)試發(fā)現(xiàn),經(jīng)過優(yōu)化后的許多頁面性能與HTTP持平甚至還有小幅提升,因此HTTPS經(jīng)過優(yōu)化之后其實(shí)并不慢。
除此之外,想要節(jié)約購(gòu)買證書的開銷也是原因之一。要進(jìn)行HTTPS通信,證書是必不可少的。而使用的證書必須向認(rèn)證機(jī)構(gòu)(CA)購(gòu)買。
最后是安全意識(shí)。相比國(guó)內(nèi),國(guó)外互聯(lián)網(wǎng)行業(yè)的安全意識(shí)和技術(shù)應(yīng)用相對(duì)成熟,HTTPS部署趨勢(shì)是由社會(huì)、企業(yè)、政府共同去推動(dòng)的。
參考文章與書籍
浪里行舟:碩士研究生,專注于前端。個(gè)人公眾號(hào):「前端工匠」,致力于打造適合初中級(jí)工程師能夠快速吸收的一系列優(yōu)質(zhì)文章!
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】