轉(zhuǎn)自微信公眾號——前端早讀課
http://mp.weixin.qq.com/s/JMfKS_c20BuFTsQPvDJtIw
每當(dāng)我們討論到信息安全的時候给郊,我們最長接觸到的信息加密傳輸?shù)姆绞侥^于 HTTPS 了,當(dāng)我們?yōu)g覽器地址欄閃現(xiàn)出綠色時,就代表著這個網(wǎng)站支持 HTTPS 的加密信息傳輸方式杠愧,并且你與它的連接確實被加密了。但是 HTTPS 并不是一個單一的東西逞壁,它知識我們常見的 HTTP 協(xié)議和某個加密協(xié)議的一個混合流济,這個加密協(xié)議通常會是 TLS。那么 HTTPS 為什么安全呢腌闯?其實我們需要先考慮 HTTP 為什么不安全绳瘟。
假設(shè)你坐在一個教室里,你現(xiàn)在非常想把某個信息傳遞給教室里的另一個人姿骏,一般來說糖声,會選擇,傳紙條分瘦。傳紙條這個比喻其實非常正確蘸泻,這就是互聯(lián)網(wǎng)的一個基礎(chǔ)協(xié)議 TCP/IP 協(xié)議基本的工作模式。而通常嘲玫,HTTP 協(xié)議的數(shù)據(jù)是使用 TCP/IP 協(xié)議進行發(fā)送的悦施。HTTP 指的是你在紙條上寫明你要傳送的目的地是哪個同學(xué)的坐位,然后再是要傳遞的內(nèi)容去团。途徑的同學(xué)拿到紙條后根據(jù)紙條上顯示的地址依次傳過去就好了抡诞。這樣要面臨的第一個問題就是:途徑的同學(xué)可以完全知道你寫了什么。
這就是 HTTP 面臨的第一個問題土陪,這個問題通常被叫做 “竊聽” 或者 “嗅探” 昼汗,指的是和你在同一個網(wǎng)絡(luò)下或者是途徑的路由上的攻擊者可以偷窺到你傳輸?shù)膬?nèi)容。這是 HTTPS 要解決的第一個問題旺坠。這種問題通常是通過“加密”來解決的乔遮。從非常原始的角度來考慮,其實就是雙方約定一個暗號取刃。用什么字母去替代什么字母之類的蹋肮。不過考慮到互聯(lián)網(wǎng)每天有無數(shù)信息需要加密出刷,這種原始的加密方法似乎不太適合。不過實際上方法也差不多坯辩,一般是采用一種叫做 AES 的算法來解決的馁龟。這種算法需要一個密鑰 key 來加密整個信息,加密和解密所需要使用的 key 是一樣的漆魔,所以這種加密一般也被稱為“對稱加密”坷檩。AES 在數(shù)學(xué)上保證了,只要你使用的 key 足夠足夠足夠足夠的長改抡,破解是幾乎不可能的矢炼。
我們先假設(shè)這種破解確實是不可能的,而且目前也確實沒有對 AES 本身能發(fā)動起有效的攻擊的案例出現(xiàn)阿纤。
我們再回到這個教室句灌,你接著要傳小紙條,你把地址寫上后欠拾,把要傳輸?shù)膬?nèi)容用 AES 蹭蹭蹭加密了起來胰锌。剛準(zhǔn)備傳,問題來了藐窄。AES 不是有一個 key 嗎资昧?key 怎么給目的地啊荆忍?如果我把密鑰直接寫在紙條上格带,那么中間的人不依然可以解密嗎?在現(xiàn)實中你可以通過一些其它方法來把密鑰安全傳輸給目的地而不被其他人看見刹枉,但是在互聯(lián)網(wǎng)上践惑,要想這么做難度就很大了,畢竟傳輸終究要經(jīng)過這些路由嘶卧,所以要做加密尔觉,還得找一個更復(fù)雜的數(shù)學(xué)方法。
于是聰明的人們發(fā)明了一種更復(fù)雜的加密算法——非對稱加密芥吟。這種加密或許理解起來比較困難侦铜,這種加密指的是可以生成一對密鑰 (k1, k2)。凡是 k1 加密的數(shù)據(jù)钟鸵,k1 自身不能解密钉稍,而需要 k2 才能解密;凡是 k2 加密的數(shù)據(jù)棺耍,k2 不能解密贡未,需要 k1 才能解密。這種算法事實上有很多,常用的是 RSA俊卤,其基于的數(shù)學(xué)原理是兩個大素數(shù)的乘積很容易算嫩挤,而拿到這個乘積去算出是哪兩個素數(shù)相乘就很復(fù)雜了。好在以目前的技術(shù)消恍,分解大數(shù)的素因數(shù)確實比較困難岂昭,尤其是當(dāng)這個大數(shù)足夠大的時候(通常使用2的10次方個二進制位這么大),就算是超級計算機解密也需要非常長的時間狠怨。
現(xiàn)在利用這種非對稱加密的方法约啊,我們來設(shè)想一個場景。你繼續(xù)想要傳紙條佣赖,但是傳紙條之前你先準(zhǔn)備把接下來通訊的對稱加密密鑰給傳輸過去恰矩。于是你用 RSA 技術(shù)生成了一對 k1、k2憎蛤,你把 k1 用明文發(fā)送了出去枢里,路經(jīng)有人或許會截取,但是沒有用蹂午,k1 加密的數(shù)據(jù)需要用 k2 才能解密。而此時彬碱,k2 在你自己的手里豆胸。k1 送達目的地后,目的地的人會去準(zhǔn)備一個接下來用于對稱加密傳輸?shù)拿荑€ key巷疼,然后用收到的 k1 把key 加密了晚胡,把加密好的數(shù)據(jù)傳回來。路上的人就算截取到了嚼沿,也解密不出 key估盘。等到了你自己手上,你用手上的 k2 把用 k1 加密的 key 解出來骡尽,現(xiàn)在全教室就只有你和你的目的地擁有 key遣妥,你們就可以用 AES 算法進行對稱加密的傳輸啦!這時候你和目的地的通訊將無法再被任何人竊聽攀细!
當(dāng)然箫踩,這時候你可能會問兩個問題。
既然非對稱加密可以那么安全谭贪,為什么我們不直接用它來加密信息境钟,而是去加密對稱加密的密鑰呢?
這是因為非對稱加密的密碼對生成和加密的消耗時間比較長俭识,為了節(jié)省雙方的計算時間慨削,通常只用它來交換密鑰,而非直接用來傳輸數(shù)據(jù)。
使用非對稱加密是完全安全的嗎缚态?
聽起來確實是挺安全的磁椒,但實際上,還有一種更惡劣的攻擊是這種方法無法防范的猿规,這就是傳說中的“中間人攻擊”衷快。我們繼續(xù)讓你坐在教室里傳小紙條。現(xiàn)在你和目的地上途徑一個中間人姨俩,他有意想要知道你們的消息蘸拔。由于這個描述比較復(fù)雜,我們將你稱為 A环葵,你的目的地稱為 B调窍,而中間人稱為 M。當(dāng)你要和 B 完成第一次密鑰交換的時候张遭,途徑了 M邓萨。M 知道你要進行密鑰交換了,它把小紙條扣了下來菊卷,假裝自己是 B缔恳,偽造了一個 key ,然后用你發(fā)來的 k1 加密了 key 發(fā)還給你洁闰,你以為你和 B 完成了密鑰交換歉甚,實際上你是和 M 完成了密鑰交換。同時 M 和 B 完成一次密鑰交換扑眉,讓 B 誤以為和你完成了密鑰交換≈叫梗現(xiàn)在,由 A -> B完整的加密腰素,變成了 A(加密連接1)-> M(明文)->B(加密連接2)的情況了聘裁。這時候 M 依然可以知道 A 和 B 傳輸中的全部信息。
對于這種事弓千,我們似乎很難找到一個解決方法來解決這個問題衡便,除非我們能從源頭保證,你密鑰交換的對象是安全的洋访。這時候我們就要認識互聯(lián)網(wǎng) HTTPS 和你傳紙條的微妙區(qū)別了砰诵。你傳紙條時,你和你的目的地的關(guān)系幾乎是對等的捌显。而你訪問網(wǎng)站時茁彭,你訪問的對象通常是一個比較大的服務(wù)供應(yīng)商,他們有充沛的資源扶歪,也許可以證明他們的合法性理肺。
這時候我們會引入一個第三方叫做 CA摄闸。CA是一些非常權(quán)威的專門用于認證一個網(wǎng)站合法性的組織。服務(wù)商可以向他們申請一個證書妹萨,使得他們建立安全連接時可以帶上 CA 的簽名年枕。而 CA 的安全性由操作系統(tǒng)或瀏覽器來認證。你的 Windows乎完、Mac熏兄、Linux、Chrome树姨、Safari等會在安裝時帶上一個他們認為安全的 CA 證書列表摩桶。如果和你建立安全連接的人帶著這些人的簽名,那么認為這個安全連接是安全的帽揪,沒有遭到中間人攻擊硝清。
CA 證書通常情況下是安全的。因為一旦某個 CA 頒發(fā)出的某個證書被用于了非法用途转晰,瀏覽器和操作系統(tǒng)一般會通過更新將整個 CA 頒發(fā)過的全部證書全部視為不安全芦拿。這使得 CA 通常在頒發(fā)證書時是比較小心的。
所以通過對稱加密 + 非對稱加密 + CA認證這三個技術(shù)混合在一起查邢,才使得 HTTP 的后面加上了一個 S —— Security蔗崎。實際上 HTTPS 的協(xié)議比我這里描述的更復(fù)雜一些,我這里說的主要是基本的實現(xiàn)原理扰藕。因為其中任何一環(huán)稍有閃失缓苛,就會使得整個加密都將變得不安全。這也是為什么 HTTPS 的加密協(xié)議從SSL 1.0 升級到 SSL 3.0 再被 TLS 1.0 現(xiàn)在被 TLS 1.2 取代实胸,其背后都是一環(huán)環(huán)細節(jié)上的修改,以防任何地方的閃失番官。
但即使如此庐完,你的 HTTPS 盡可能的保證了你傳輸?shù)陌踩@種安全也不是絕對的徘熔。比如 CA 證書出了問題被用于了中間人攻擊门躯,在短期內(nèi),你的安全將會陷入直接的麻煩直到瀏覽器或操作系統(tǒng)重新更新了你的 CA 列表或者你手動調(diào)整了這個列表酷师。但大多情況下不必杞人憂天讶凉,它基本上是安全的。
當(dāng)然了山孔,路由也可以選擇直接丟包懂讯,它看不到的,也不讓你看到台颠。