進(jìn)階篇:HTTPS之新的烏云來襲
朋友們,我是fossi,今天開始進(jìn)入新的篇章,也是本系列正序的最后一個(gè)篇章,我們來看看還有什么問題沒有得到解決。
一、一片烏云
縱觀TCP/IP四層模型,我們花了很多章節(jié)將核心的基礎(chǔ)部分全部叨叨完了,只要主機(jī)接入互聯(lián)網(wǎng),主機(jī)上都安裝TCP/IP驅(qū)動(dòng)程序,我們就可以順利將消息從一端的應(yīng)用程序順利傳達(dá)到世界上任意另一端的應(yīng)用程序上,并且還可以借助客戶端瀏覽器展示花花綠綠的美好世界。
我們仿佛置身于美麗而晴朗的天空下,愜意且得意,盡情地享受陽光的沐浴,可是,一片大大的烏云頃刻間來到了眼前:安全問題。
安全問題是一個(gè)領(lǐng)域很大的問題,本系列聚焦的是HTTP協(xié)議本身的安全問題。
二、HTTP的弱點(diǎn)
HTTP協(xié)議,在設(shè)計(jì)之初并未考慮安全問題,它的設(shè)計(jì)初衷是用來進(jìn)行數(shù)據(jù)傳輸和共享。
隨著web應(yīng)用的普及,有一小部分黑客借助HTTP的弱點(diǎn)進(jìn)行攻擊,輕則獲取你的喜好或?yàn)g覽記錄,重則盜取銀行賬號(hào)、販賣你的個(gè)人信息。
本系列主要關(guān)注中間人攻擊,所謂中間人就是在客戶端和服務(wù)器之間有一雙無形黑手,對(duì)于客戶端和服務(wù)器來說,根本不會(huì)意識(shí)到有中間人的存在,也沒有辦法進(jìn)行防御。
那么HTTP到底有什么弱點(diǎn)呢?
(1)第一個(gè)弱點(diǎn)是:數(shù)據(jù)未進(jìn)行加密,一切信息在互聯(lián)網(wǎng)上裸奔。
我們知道,從瀏覽器出發(fā),到最終的服務(wù)器,會(huì)經(jīng)過大量中間節(jié)點(diǎn),若數(shù)據(jù)未加密,可輕松在某個(gè)節(jié)點(diǎn)上進(jìn)行截獲并結(jié)合工具理解其含義。
有的讀者朋友可能會(huì)問:我是否可以在代碼層面使用各種加密算法對(duì)內(nèi)容進(jìn)行加密和解密呢?即在應(yīng)用層上對(duì)傳輸?shù)臄?shù)據(jù)本身進(jìn)行加密。
這個(gè)沒有從根本上解決此問題,因?yàn)榧幢隳憧梢詫?duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,但是不能對(duì)HTTP頭部進(jìn)行加密,而HTTP頭部信息是否加密也是在安全考慮范圍內(nèi)的。
同時(shí)此方案不具備通用性,比如服務(wù)器對(duì)HTML數(shù)據(jù)進(jìn)行加密后發(fā)給瀏覽器,而瀏覽器本身卻不會(huì)單獨(dú)適配你的服務(wù)端進(jìn)行解密后再進(jìn)行頁面渲染。
(2)第二個(gè)弱點(diǎn)是:無法驗(yàn)證身份,對(duì)端跟你聊天的可能是一只狗。
對(duì)于HTTP協(xié)議來說,只要傳輸?shù)男畔⒎螲TTP規(guī)范即可,而不會(huì)確認(rèn)雙方的身份,也沒有確認(rèn)雙方身份的標(biāo)準(zhǔn)。
基于這個(gè)一點(diǎn),很有可能實(shí)際訪問到的網(wǎng)站并不是官方的真實(shí)網(wǎng)站,原因可能是在你的電腦或者中間DNS上被劫持到了騙子的網(wǎng)站上。
這一點(diǎn)相信讀者朋友們會(huì)感覺后背發(fā)涼,當(dāng)你付款的時(shí)候,都無法確認(rèn)對(duì)方是誰,你還敢支付嗎?甚至連密碼都不敢輸入了,因?yàn)楹苡锌赡苣愕拿艽a和個(gè)人信息也被竊取走。
真是可惡,防不勝防!
(3)第三個(gè)弱點(diǎn)是:數(shù)據(jù)被篡改,我愛你變成我恨你。
鑒于存在中間人攻擊,中間人在獲取到你的信息后,不僅可以隨心所欲看你的隱私,甚至還可以將你發(fā)送的信息進(jìn)行篡改后再發(fā)送出去。
但是由于客戶端和服務(wù)端并沒有數(shù)據(jù)是否篡改的校驗(yàn)機(jī)制,服務(wù)端無條件信任所有接收到的信息。
好啊,殺人還誅心,這個(gè)破網(wǎng)是不能再上了!
三、密碼學(xué)初探
我的意中人是個(gè)蓋世英雄,有一天他會(huì)踩著七色的云彩來娶我。
意中人的名字叫做HTTPS,理解HTTPS之前必須掌握基本的密碼學(xué)知識(shí),HTTPS本質(zhì)上就是對(duì)密碼學(xué)算法的組合。
之所以這片烏云這么大,罪魁禍?zhǔn)拙褪菭可娴矫艽a學(xué),而密碼學(xué)關(guān)系到數(shù)學(xué),這一點(diǎn)要想深入下去,則又是一門學(xué)科了;而烏云之所以這么黑,是因?yàn)榘踩珶o小事,一旦出事就是大問題,這也是密碼學(xué)這么深?yuàn)W且重要的原因。
目前流行的密碼學(xué)算法實(shí)現(xiàn)是公開的,是經(jīng)歷了長時(shí)間考驗(yàn)的,是由佷多理具備深厚數(shù)學(xué)知識(shí)的數(shù)學(xué)家們所創(chuàng)造,對(duì)于開發(fā)者來說,即使不了解其背后原理,也可以容易地上手使用他們。
在使用他們的時(shí)候,我們必須持有這樣的態(tài)度:
- 世界上不存在一種密碼學(xué)算法,能解決所有的安全問題,需要具體問題具體分析。
- 世界上也沒有絕對(duì)安全的密碼學(xué)算法,對(duì)于算法應(yīng)用者來說,確保目前使用的密碼學(xué)算法是安全的就可以了。
所以我們最重要的任務(wù)是了解特定的一些密碼學(xué)算法解決了何種問題、在正確的場景下能正確地使用他們。
四、密碼學(xué)目標(biāo)
我們上面提三個(gè)HTTP的弱點(diǎn),而引入密碼學(xué)就是為了解決問題,我們來看看密碼學(xué)的目標(biāo)。
(1)機(jī)密性
解決信息裸奔問題,密碼學(xué)最最最核心的任務(wù)當(dāng)然是負(fù)責(zé)數(shù)據(jù)加密,只要外人不知道密鑰,即使拿到密文信息也毫無意義。
(2)完整性
解決數(shù)據(jù)篡改問題,即使是加密數(shù)據(jù),如果數(shù)據(jù)被中間人篡改,則應(yīng)該可以通過某種策略知曉,保障收到的數(shù)據(jù)就是發(fā)送方發(fā)出來的原始數(shù)據(jù)。
在密碼學(xué)中,主要使用消息驗(yàn)證碼( MAC )算法保證完整性 。
(3)身份驗(yàn)證和不可抵賴性
通信雙方必須確保對(duì)端就是要通信的對(duì)象。在密碼學(xué)中,一般使用數(shù)字簽名技術(shù)確認(rèn)身份。
此外,數(shù)字簽名技術(shù)還能避免抵賴,舉個(gè)例子,A向B借錢了,并寫了張借條,當(dāng)B希望A還錢時(shí),A抵賴說借條不是他寫的,理由就是有人冒充他寫了這張借條。
接下來我們?cè)賮沓榻z剝繭,慢慢探索HTTPS是如何解決如上問題的。