每當(dāng)我們討論到信息安全的時(shí)候,我們最長(zhǎng)接觸到的信息加密傳輸?shù)姆绞侥^(guò)于 HTTPS 了霹娄,當(dāng)我們?yōu)g覽器地址欄閃現(xiàn)出綠色時(shí)能犯,就代表著這個(gè)網(wǎng)站支持 HTTPS 的加密信息傳輸方式,并且你與它的連接確實(shí)被加密了犬耻。但是 HTTPS 并不是一個(gè)單一的東西踩晶,它只是我們常見(jiàn)的 HTTP 協(xié)議和某個(gè)加密協(xié)議的一個(gè)混合,這個(gè)加密協(xié)議通常會(huì)是 TLS枕磁。那么 HTTPS 為什么安全呢渡蜻?其實(shí)我們需要先考慮 HTTP 為什么不安全。
假設(shè)你坐在一個(gè)教室里计济,你現(xiàn)在非常想把某個(gè)信息傳遞給教室里的另一個(gè)人茸苇,一般來(lái)說(shuō),會(huì)選擇沦寂,傳紙條学密。傳紙條這個(gè)比喻其實(shí)非常正確,這就是互聯(lián)網(wǎng)的一個(gè)基礎(chǔ)協(xié)議 TCP/IP 協(xié)議基本的工作模式传藏。而通常腻暮,HTTP 協(xié)議的數(shù)據(jù)是使用 TCP/IP 協(xié)議進(jìn)行發(fā)送的。HTTP 指的是你在紙條上寫(xiě)明你要傳送的目的地是哪個(gè)同學(xué)的坐位漩氨,然后再是要傳遞的內(nèi)容西壮。途徑的同學(xué)拿到紙條后根據(jù)紙條上顯示的地址依次傳過(guò)去就好了遗增。這樣要面臨的第一個(gè)問(wèn)題就是:途徑的同學(xué)可以完全知道你寫(xiě)了什么叫惊。
這就是 HTTP 面臨的第一個(gè)問(wèn)題,這個(gè)問(wèn)題通常被叫做 “竊聽(tīng)” 或者 “嗅探” 做修,指的是和你在同一個(gè)網(wǎng)絡(luò)下或者是途徑的路由上的攻擊者可以偷窺到你傳輸?shù)膬?nèi)容霍狰。這是 HTTPS 要解決的第一個(gè)問(wèn)題。這種問(wèn)題通常是通過(guò)“加密”來(lái)解決的饰及。從非常原始的角度來(lái)考慮蔗坯,其實(shí)就是雙方約定一個(gè)暗號(hào)。用什么字母去替代什么字母之類(lèi)的燎含。不過(guò)考慮到互聯(lián)網(wǎng)每天有無(wú)數(shù)信息需要加密宾濒,這種原始的加密方法似乎不太適合。不過(guò)實(shí)際上方法也差不多屏箍,一般是采用一種叫做 AES 的算法來(lái)解決的绘梦。這種算法需要一個(gè) 密鑰 key 來(lái)加密整個(gè)信息橘忱,加密和解密所需要使用的 key 是一樣的,所以這種加密一般也被稱為“對(duì)稱加密”卸奉。AES 在數(shù)學(xué)上保證了钝诚,只要你使用的 key 足夠足夠足夠足夠的長(zhǎng),破解是幾乎不可能的榄棵。
我們先假設(shè)這種破解確實(shí)是不可能的凝颇,而且目前也確實(shí)沒(méi)有對(duì) AES 本身能發(fā)動(dòng)起有效的攻擊的案例出現(xiàn)。
我們?cè)倩氐竭@個(gè)教室疹鳄,你接著要傳小紙條拧略,你把地址寫(xiě)上后,把要傳輸?shù)膬?nèi)容用 AES 蹭蹭蹭加密了起來(lái)瘪弓。剛準(zhǔn)備傳辑鲤,問(wèn)題來(lái)了。AES 不是有一個(gè) key 嗎杠茬?key 怎么給目的地霸氯臁?如果我把密鑰直接寫(xiě)在紙條上瓢喉,那么中間的人不依然可以解密嗎宁赤?在現(xiàn)實(shí)中你可以通過(guò)一些其它方法來(lái)把密鑰安全傳輸給目的地而不被其他人看見(jiàn),但是在互聯(lián)網(wǎng)上栓票,要想這么做難度就很大了决左,畢竟傳輸終究要經(jīng)過(guò)這些路由,所以要做加密走贪,還得找一個(gè)更復(fù)雜的數(shù)學(xué)方法佛猛。
于是聰明的人們發(fā)明了一種更復(fù)雜的加密算法——非對(duì)稱加密。這種加密或許理解起來(lái)比較困難坠狡,這種加密指的是可以生成一對(duì)密鑰 (k1, k2)继找。凡是 k1 加密的數(shù)據(jù),k1 自身不能解密逃沿,而需要 k2 才能解密婴渡;凡是 k2 加密的數(shù)據(jù),k2 不能解密凯亮,需要 k1 才能解密边臼。這種算法事實(shí)上有很多,常用的是 RSA假消,其基于的數(shù)學(xué)原理是兩個(gè)大素?cái)?shù)的乘積很容易算柠并,而拿到這個(gè)乘積去算出是哪兩個(gè)素?cái)?shù)相乘就很復(fù)雜了。好在以目前的技術(shù),分解大數(shù)的素因數(shù)確實(shí)比較困難臼予,尤其是當(dāng)這個(gè)大數(shù)足夠大的時(shí)候(通常使用2的10次方個(gè)二進(jìn)制位這么大)亿傅,就算是超級(jí)計(jì)算機(jī)解密也需要非常長(zhǎng)的時(shí)間。
現(xiàn)在利用這種非對(duì)稱加密的方法瘟栖,我們來(lái)設(shè)想一個(gè)場(chǎng)景葵擎。你繼續(xù)想要傳紙條,但是傳紙條之前你先準(zhǔn)備把接下來(lái)通訊的對(duì)稱加密密鑰給傳輸過(guò)去半哟。于是你用 RSA 技術(shù)生成了一對(duì) k1酬滤、k2,你把 k1 用明文發(fā)送了出去寓涨,路經(jīng)有人或許會(huì)截取盯串,但是沒(méi)有用,k1 加密的數(shù)據(jù)需要用 k2 才能解密戒良。而此時(shí)体捏,k2 在你自己的手里。k1 送達(dá)目的地后糯崎,目的地的人會(huì)去準(zhǔn)備一個(gè)接下來(lái)用于對(duì)稱加密傳輸?shù)拿荑€ key几缭,然后用收到的 k1 把 key 加密了,把加密好的數(shù)據(jù)傳回來(lái)沃呢。路上的人就算截取到了年栓,也解密不出 key。等到了你自己手上薄霜,你用手上的 k2 把用 k1 加密的 key 解出來(lái)某抓,現(xiàn)在全教室就只有你和你的目的地?fù)碛?key,你們就可以用 AES 算法進(jìn)行對(duì)稱加密的傳輸啦惰瓜!這時(shí)候你和目的地的通訊將無(wú)法再被任何人竊聽(tīng)否副!
當(dāng)然,這時(shí)候你可能會(huì)問(wèn)兩個(gè)問(wèn)題崎坊。
既然 非對(duì)稱加密 可以那么安全备禀,為什么我們不直接用它來(lái)加密信息,而是去加密 對(duì)稱加密 的密鑰呢流强?
這是因?yàn)?非對(duì)稱加密 的密碼對(duì)生成和加密的消耗時(shí)間比較長(zhǎng)痹届,為了節(jié)省雙方的計(jì)算時(shí)間,通常只用它來(lái)交換密鑰打月,而非直接用來(lái)傳輸數(shù)據(jù)。
使用 非對(duì)稱加密 是完全安全的嗎蚕捉?
聽(tīng)起來(lái)確實(shí)是挺安全的奏篙,但實(shí)際上,還有一種更惡劣的攻擊是這種方法無(wú)法防范的,這就是傳說(shuō)中的“中間人攻擊”秘通。我們繼續(xù)讓你坐在教室里傳小紙條∥希現(xiàn)在你和目的地上途徑一個(gè)中間人,他有意想要知道你們的消息肺稀。由于這個(gè)描述比較復(fù)雜第股,我們將你稱為 A,你的目的地稱為 B话原,而中間人稱為 M夕吻。當(dāng)你要和 B 完成第一次密鑰交換的時(shí)候,途徑了 M繁仁。M 知道你要進(jìn)行密鑰交換了涉馅,它把小紙條扣了下來(lái),假裝自己是 B黄虱,偽造了一個(gè) key 稚矿,然后用你發(fā)來(lái)的 k1 加密了 key 發(fā)還給你,你以為你和 B 完成了密鑰交換捻浦,實(shí)際上你是和 M 完成了密鑰交換晤揣。同時(shí) M 和 B 完成一次密鑰交換,讓 B 誤以為和你完成了密鑰交換≈觳樱現(xiàn)在碉渡,由 A -> B完整的加密,變成了 A(加密連接1) -> M(明文)->B(加密連接2)的情況了母剥。這時(shí)候 M 依然可以知道 A 和 B 傳輸中的全部信息滞诺。
對(duì)于這種事,我們似乎很難找到一個(gè)解決方法來(lái)解決這個(gè)問(wèn)題环疼,除非我們能從源頭保證习霹,你密鑰交換的對(duì)象是安全的。這時(shí)候我們就要認(rèn)識(shí)互聯(lián)網(wǎng) HTTPS 和你傳紙條的微妙區(qū)別了炫隶。你傳紙條時(shí)淋叶,你和你的目的地的關(guān)系幾乎是對(duì)等的。而你訪問(wèn)網(wǎng)站時(shí)伪阶,你訪問(wèn)的對(duì)象通常是一個(gè)比較大的服務(wù)供應(yīng)商煞檩,他們有充沛的資源,也許可以證明他們的合法性栅贴。
這時(shí)候我們會(huì)引入一個(gè)第三方叫做 CA斟湃。CA 是一些非常權(quán)威的專(zhuān)門(mén)用于認(rèn)證一個(gè)網(wǎng)站合法性的組織。服務(wù)商可以向他們申請(qǐng)一個(gè)證書(shū)檐薯,使得他們建立安全連接時(shí)可以帶上 CA 的簽名凝赛。而 CA 的安全性由操作系統(tǒng)或?yàn)g覽器來(lái)認(rèn)證注暗。你的 Windows、Mac墓猎、Linux捆昏、Chrome、Safari 等會(huì)在安裝時(shí)帶上一個(gè)他們認(rèn)為安全的 CA 證書(shū)列表毙沾。如果和你建立安全連接的人帶著這些人的簽名骗卜,那么認(rèn)為這個(gè)安全連接是安全的,沒(méi)有遭到中間人攻擊左胞。
CA 證書(shū)通常情況下是安全的寇仓。因?yàn)橐坏┠硞€(gè) CA 頒發(fā)出的某個(gè)證書(shū)被用于了非法用途,瀏覽器和操作系統(tǒng)一般會(huì)通過(guò)更新將整個(gè) CA 頒發(fā)過(guò)的全部證書(shū)全部視為不安全罩句。這使得 CA 通常在頒發(fā)證書(shū)時(shí)是比較小心的焚刺。
所以通過(guò) 對(duì)稱加密 + 非對(duì)稱加密 + CA認(rèn)證 這三個(gè)技術(shù)混合在一起,才使得 HTTP 的后面加上了一個(gè) S —— Security门烂。實(shí)際上 HTTPS 的協(xié)議比我這里描述的更復(fù)雜一些乳愉,我這里說(shuō)的主要是基本的實(shí)現(xiàn)原理。因?yàn)槠渲腥魏我画h(huán)稍有閃失屯远,就會(huì)使得整個(gè)加密都將變得不安全蔓姚。這也是為什么 HTTPS 的加密協(xié)議從SSL 1.0 升級(jí)到 SSL 3.0 再被 TLS 1.0 現(xiàn)在被 TLS 1.2 取代,其背后都是一環(huán)環(huán)細(xì)節(jié)上的修改慨丐,以防任何地方的閃失坡脐。
但即使如此,你的 HTTPS 盡可能的保證了你傳輸?shù)陌踩拷遥@種安全也不是絕對(duì)的备闲。比如 CA 證書(shū)出了問(wèn)題被用于了中間人攻擊,在短期內(nèi)捅暴,你的安全將會(huì)陷入直接的麻煩直到瀏覽器或操作系統(tǒng)重新更新了你的 CA 列表或者你手動(dòng)調(diào)整了這個(gè)列表恬砂。但大多情況下不必杞人憂天,它基本上是安全的蓬痒。
當(dāng)然了泻骤,路由也可以選擇直接丟包,它看不到的梧奢,也不讓你看到狱掂。
作者:程序員Delton
鏈接:http://www.reibang.com/p/b894a7e1c779
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)亲轨,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處趋惨。