本文來(lái)自@Keely袁慶玲;來(lái)源:https://juejin.im/post/5ad6ad575188255c272273c4
目前來(lái)看大多數(shù)網(wǎng)站都從HTTP轉(zhuǎn)向HTTPS捍掺,不在支持HTTP训枢,所以了解下HTTPS對(duì)于程序員來(lái)說(shuō)是很有必要的...
正文從這里開(kāi)始 ~
一、HTTP存在的問(wèn)題
1.1 可能被竊聽(tīng)
HTTP 本身不具備加密的功能醉旦,HTTP 報(bào)文使用明文方式發(fā)送饶米。由于互聯(lián)網(wǎng)是由聯(lián)通世界各個(gè)地方的網(wǎng)絡(luò)設(shè)施組成,所有發(fā)送和接收經(jīng)過(guò)某些設(shè)備的數(shù)據(jù)都可能被截獲或窺視车胡。(例如大家都熟悉的抓包工具:Wireshark)
1.2 認(rèn)證問(wèn)題
無(wú)法確認(rèn)你發(fā)送到的服務(wù)器就是真正的目標(biāo)服務(wù)器(可能服務(wù)器是偽裝的)
無(wú)法確定返回的客戶端是否是按照真實(shí)意圖接收的客戶端(可能是偽裝的客戶端)
無(wú)法確定正在通信的對(duì)方是否具備訪問(wèn)權(quán)限檬输,Web 服務(wù)器上某些重要的信息,只想發(fā)給特定用戶即使是無(wú)意義的請(qǐng)求也會(huì)照單全收匈棘。無(wú)法阻止海量請(qǐng)求下的 DoS 攻擊(Denial of Service褪猛,拒絕服務(wù)攻擊)。
1.3 可能被篡改
請(qǐng)求或響應(yīng)在傳輸途中羹饰,遭攻擊者攔截并篡改內(nèi)容的攻擊被稱為中間人攻擊(Man-in-the-Middle attack伊滋,MITM)。
二队秩、HTTPS介紹
2.1 什么是HTTPS
超文本傳輸安全協(xié)議(英語(yǔ):Hypertext Transfer Protocol Secure笑旺,縮寫(xiě):HTTPS,常稱為HTTP over TLS馍资,HTTP over SSL或HTTP Secure)是一種通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行安全通信的傳輸協(xié)議筒主。HTTPS經(jīng)由HTTP進(jìn)行通信,但利用SSL/TLS來(lái)加密數(shù)據(jù)包。HTTPS開(kāi)發(fā)的主要目的乌妙,是提供對(duì)網(wǎng)站服務(wù)器的身份認(rèn)證使兔,保護(hù)交換數(shù)據(jù)的隱私與完整性。
2.2 HTTPS怎么解決上述問(wèn)題
HTTPS是在通信接口部分用 TLS(Transport Layer Security 傳輸層安全性協(xié)議)藤韵,TLS協(xié)議采用主從式架構(gòu)模型虐沥,用于在兩個(gè)應(yīng)用程序間通過(guò)網(wǎng)絡(luò)創(chuàng)建起安全的連接,防止在交換數(shù)據(jù)時(shí)受到竊聽(tīng)及篡改泽艘。
2.3 SSL和TLS的關(guān)系
傳輸層安全性協(xié)議(英語(yǔ):Transport Layer Security欲险,縮寫(xiě)作 TLS),及其前身安全套接層(Secure Sockets Layer匹涮,縮寫(xiě)作 SSL)是一種安全協(xié)議天试,目的是為互聯(lián)網(wǎng)通信,提供安全及數(shù)據(jù)完整性保障然低。
網(wǎng)景公司(Netscape)在1994年推出首版網(wǎng)頁(yè)瀏覽器喜每,網(wǎng)景導(dǎo)航者時(shí),推出HTTPS協(xié)議雳攘,以SSL進(jìn)行加密带兜,這是SSL的起源。
IETF將SSL進(jìn)行標(biāo)準(zhǔn)化来农,1999年公布第一版TLS標(biāo)準(zhǔn)文件鞋真。隨后又公布RFC 5246 (2008年8月)與 RFC 6176 (2011年3月)。在瀏覽器沃于、電子郵件涩咖、即時(shí)通信、VoIP繁莹、網(wǎng)絡(luò)傳真等應(yīng)用程序中檩互,廣泛支持這個(gè)協(xié)議。
2.4 TLS/SSL 協(xié)議
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)證信息的完整性。
2.5 用信鴿來(lái)解釋
密碼學(xué)是一門難以理解的學(xué)科遭赂,說(shuō)起來(lái)也很抽象循诉,而在互聯(lián)網(wǎng)上任何活動(dòng)都可以認(rèn)為是從某臺(tái)服務(wù)器上發(fā)送和接受信息。我們可以假設(shè)這些消息是用信鴿來(lái)傳遞的撇他。
在談之前我們先說(shuō)一下愛(ài)麗絲茄猫、鮑勃和馬洛里狈蚤。他們是廣泛地代入密碼學(xué)和物理學(xué)領(lǐng)域的通用角色。這些名稱是為了方便說(shuō)明議題划纽,如果句子類似“甲想發(fā)送消息給乙”脆侮,當(dāng)議題變得越復(fù)雜,將越難理解及容易混亂勇劣。而在典型的協(xié)議運(yùn)行中靖避,這些人物不一定是一個(gè)“人類”,而可能是一個(gè)可信賴的自動(dòng)式代理人(如電腦程序)芭毙。使用這些名稱有助說(shuō)明的結(jié)構(gòu)筋蓖,有時(shí)也會(huì)用作幽默卸耘。
2.5.1 初步交流
如果愛(ài)麗絲想要給鮑勃發(fā)送一段信息退敦,她會(huì)把信息綁在信鴿的腿上然后送往鮑勃那里。鮑勃收到了信息蚣抗,并閱讀了信息侈百,非常完美。
但如果馬洛里攔截了愛(ài)麗絲的鴿子并且篡改了信息呢翰铡?鮑勃就沒(méi)有辦法去知道愛(ài)麗絲發(fā)出的信息在傳遞過(guò)程中遭到了修改钝域。
這就是 HTTP 如何運(yùn)作的《В看起來(lái)很可怕對(duì)吧例证?我是不會(huì)通過(guò) HTTP 來(lái)發(fā)送我的銀行資信證明的,并且你也不應(yīng)如此迷捧。
2.5.2 隱蔽的密碼
那么如果愛(ài)麗絲和鮑勃都非常的機(jī)智织咧。他們一致認(rèn)同使用一種隱蔽的密碼來(lái)書(shū)寫(xiě)他們的信息。他們會(huì)將信息中的每個(gè)字母按照字母表中的順序前移三位漠秋。比如笙蒙,D→A,E→B庆锦,F(xiàn)→C捅位。如此一來(lái),原文為 “secret message” 的信息就變成了 “pbzobq jbppxdb” 搂抒。
那現(xiàn)在如果馬洛里再截獲了信鴿艇搀,她既不能做出有意義的修改同時(shí)也不會(huì)知道信息的內(nèi)容,因?yàn)樗恢离[蔽的密碼到底是什么求晶。然而鮑勃卻可以很容易反轉(zhuǎn)密碼焰雕,依靠 A → D, B → E, C → F 之類的規(guī)則破譯信息的內(nèi)容。加密后的信息 “pbzobq jbppxdb” 會(huì)被破解還原為 “secret message” 誉帅。
這就是對(duì)稱密匙加密淀散,因?yàn)槿绻阒廊绾渭用芤欢涡畔⒛敲茨阃瑯涌梢越饷苓@段信息右莱。
上述的密碼通常被稱為凱撒碼。在現(xiàn)實(shí)生活中档插,我們會(huì)使用更為奇特和復(fù)雜的密碼慢蜓,但原理相同蛙粘。
2.5.3 我們?nèi)绾螞Q定密匙瓜挽?
如果除了發(fā)信者和收信者之外沒(méi)有人知道使用的是什么密匙,對(duì)稱密匙加密是非常安全的购笆。在凱撒加密中则剃,密匙就是每個(gè)字母變到加密字母需要移動(dòng)多少位的偏移量耘柱。我之前的距離中,使用的偏移量是 3 棍现,但是也可以用 4 或者 12 调煎。
問(wèn)題是如果愛(ài)麗絲和鮑勃在開(kāi)始用信鴿傳信之前沒(méi)有碰過(guò)頭,他們沒(méi)有一個(gè)安全的方式來(lái)確立密匙己肮。如果他們自己來(lái)在信中傳遞密匙士袄,馬洛里就會(huì)截獲信息并發(fā)現(xiàn)密匙。這就使得馬洛里可以在愛(ài)麗絲和鮑勃開(kāi)始加密他們的信息之前或之后谎僻,閱讀到他們信息的內(nèi)容并按照她的意愿來(lái)篡改信息娄柳。
這是一個(gè)中間人攻擊的典型例子,避免這個(gè)問(wèn)題的唯一方法就是收發(fā)信的兩方一起修改他們的編碼系統(tǒng)艘绍。
2.5.4 通過(guò)信鴿傳遞盒子
所以愛(ài)麗絲和鮑勃就想出了一個(gè)更好的系統(tǒng)赤拒。當(dāng)鮑勃想要給愛(ài)麗絲發(fā)送信息時(shí),他會(huì)按照如下的步驟來(lái)進(jìn)行:
鮑勃向愛(ài)麗絲送一只沒(méi)有攜帶任何信息的鴿子诱鞠。
愛(ài)麗絲給鮑勃送回鴿子挎挖,并且這只鴿子帶有一個(gè)有開(kāi)著的鎖的盒子,愛(ài)麗絲保管著鎖的鑰匙般甲。
鮑勃把信放進(jìn)盒子中肋乍,把鎖鎖上然后把盒子送給愛(ài)麗絲。
愛(ài)麗絲收到盒子敷存,用鑰匙打開(kāi)然后閱讀信息墓造。
這樣馬洛里就不能通過(guò)截獲鴿子來(lái)篡改信息了,因?yàn)樗龥](méi)有打開(kāi)盒子的鑰匙锚烦。當(dāng)愛(ài)麗絲要給鮑勃發(fā)送消息的時(shí)候同樣按照上述的流程觅闽。
愛(ài)麗絲和鮑勃所使用的流程通常被稱為非對(duì)稱密鑰加密。之所以稱之為非對(duì)稱涮俄,是因?yàn)榧词故悄惆研畔⒕幋a(鎖上盒子)也不能破譯信息(打開(kāi)鎖住的盒子)蛉拙。
在術(shù)語(yǔ)中,盒子被稱為公匙而用來(lái)打開(kāi)盒子的鑰匙被稱為私匙彻亲。
2.5.5 如何信任盒子
但是會(huì)發(fā)現(xiàn)還是存在問(wèn)題孕锄。當(dāng)鮑勃收到盒子時(shí)他如何能確定這個(gè)盒子來(lái)自愛(ài)麗絲而不是馬洛里截獲了鴿子然后換了一個(gè)她有鑰匙能打開(kāi)的盒子呢吮廉?
愛(ài)麗絲決定簽名標(biāo)記一下盒子,這樣鮑勃收到盒子的時(shí)候就可以檢查簽名來(lái)確定是愛(ài)麗絲送出的盒子了畸肆。
那么鮑勃如何打一開(kāi)始就能識(shí)別出愛(ài)麗絲的簽名呢宦芦?這是個(gè)好問(wèn)題。愛(ài)麗絲和鮑勃也確實(shí)有這個(gè)問(wèn)題轴脐,所以他們決定讓泰德代替愛(ài)麗絲來(lái)標(biāo)記這個(gè)盒子调卑。
那么誰(shuí)是泰德呢?泰德很有名的大咱,是一個(gè)值得信任的家伙恬涧。他會(huì)給任何人簽名并且所有人都信任他只會(huì)給合法的人簽名標(biāo)記盒子。
如果泰德可以確認(rèn)索要簽名的人是愛(ài)麗絲碴巾,他就會(huì)在愛(ài)麗絲的盒子上簽名溯捆。因此馬洛里就不可能搞到一個(gè)有著泰德代表愛(ài)麗絲簽了名的盒子,因?yàn)轷U勃知道泰德只會(huì)給他確認(rèn)過(guò)的人簽名餐抢,從而識(shí)破馬洛里的詭計(jì)现使。
泰德的角色在術(shù)語(yǔ)中被稱為認(rèn)證機(jī)構(gòu)低匙。而你閱讀此文時(shí)所用的瀏覽器打包存有許多認(rèn)證機(jī)構(gòu)的簽名旷痕。
所以當(dāng)你首次接入一個(gè)網(wǎng)站的時(shí)候你可以信任來(lái)自這個(gè)站點(diǎn)的盒子因?yàn)槟阈湃翁┑露┑聲?huì)告訴你盒子是合法的。
2.5.6 沉重的盒子
現(xiàn)在愛(ài)麗絲和鮑勃有了一個(gè)可靠的系統(tǒng)來(lái)進(jìn)行交流顽冶,然他們也意識(shí)到讓鴿子攜帶盒子比原本只攜帶信件要慢一些欺抗。
因此他們決定只有在選擇用對(duì)稱加密來(lái)給信息編碼(還記得凱撒加密法吧?)的密匙時(shí)强重,使用傳遞盒子的方法(非對(duì)稱加密)绞呈。
這樣就可以二者的優(yōu)點(diǎn)兼具了,非對(duì)稱加密的可靠性和對(duì)稱加密的高效性间景。
現(xiàn)實(shí)世界中我們不會(huì)用信鴿這樣慢的送信手段佃声,但用非對(duì)稱加密來(lái)編碼信息仍要慢于使用對(duì)稱加密技術(shù),所以我們只有在交換編碼密匙的時(shí)候會(huì)使用非對(duì)稱加密技術(shù)倘要。
那么相信現(xiàn)在的你已經(jīng)了解了HTTPS是如何工作的了~