HTTPS 是如何保證安全的?
每當我們討論到信息安全的時候,我們最長接觸到的信息加密傳輸的方式莫過于 HTTPS 了,當我們瀏覽器地址欄閃現出綠色時,就代表著這個網站支持 HTTPS 的加密信息傳輸方式,并且你與它的連接確實被加密了。但是 HTTPS 并不是一個單一的東西,它知識我們常見的 HTTP 協議和某個加密協議的一個混合,這個加密協議通常會是 TLS。那么 HTTPS 為什么安全呢?其實我們需要先考慮 HTTP 為什么不安全。
假設你坐在一個教室里,你現在非常想把某個信息傳遞給教室里的另一個人,一般來說,會選擇,傳紙條。傳紙條這個比喻其實非常正確,這就是互聯網的一個基礎協議 TCP/IP 協議基本的工作模式。而通常,HTTP 協議的數據是使用 TCP/IP 協議進行發送的。HTTP 指的是你在紙條上寫明你要傳送的目的地是哪個同學的坐位,然后再是要傳遞的內容。途徑的同學拿到紙條后根據紙條上顯示的地址依次傳過去就好了。這樣要面臨的第一個問題就是:途徑的同學可以完全知道你寫了什么。
這就是 HTTP 面臨的第一個問題,這個問題通常被叫做 “竊聽” 或者 “嗅探” ,指的是和你在同一個網絡下或者是途徑的路由上的攻擊者可以偷窺到你傳輸的內容。這是 HTTPS 要解決的第一個問題。這種問題通常是通過“加密”來解決的。從非常原始的角度來考慮,其實就是雙方約定一個暗號。用什么字母去替代什么字母之類的。不過考慮到互聯網每天有無數信息需要加密,這種原始的加密方法似乎不太適合。不過實際上方法也差不多,一般是采用一種叫做 AES 的算法來解決的。這種算法需要一個 密鑰 key 來加密整個信息,加密和解密所需要使用的 key 是一樣的,所以這種加密一般也被稱為“對稱加密”。AES 在數學上保證了,只要你使用的 key 足夠足夠足夠足夠的長,破解是幾乎不可能的。
我們先假設這種破解確實是不可能的,而且目前也確實沒有對 AES 本身能發動起有效的攻擊的案例出現。
我們再回到這個教室,你接著要傳小紙條,你把地址寫上后,把要傳輸的內容用 AES 蹭蹭蹭加密了起來。剛準備傳,問題來了。AES 不是有一個 key 嗎?key 怎么給目的地啊?如果我把密鑰直接寫在紙條上,那么中間的人不依然可以解密嗎?在現實中你可以通過一些其它方法來把密鑰安全傳輸給目的地而不被其他人看見,但是在互聯網上,要想這么做難度就很大了,畢竟傳輸終究要經過這些路由,所以要做加密,還得找一個更復雜的數學方法。
于是聰明的人們發明了一種更復雜的加密算法——非對稱加密。這種加密或許理解起來比較困難,這種加密指的是可以生成一對密鑰 (k1, k2)。凡是 k1 加密的數據,k1 自身不能解密,而需要 k2 才能解密;凡是 k2 加密的數據,k2 不能解密,需要 k1 才能解密。這種算法事實上有很多,常用的是 RSA,其基于的數學原理是兩個大素數的乘積很容易算,而拿到這個乘積去算出是哪兩個素數相乘就很復雜了。好在以目前的技術,分解大數的素因數確實比較困難,尤其是當這個大數足夠大的時候(通常使用2的10次方個二進制位這么大),就算是超級計算機解密也需要非常長的時間。
現在利用這種非對稱加密的方法,我們來設想一個場景。你繼續想要傳紙條,但是傳紙條之前你先準備把接下來通訊的對稱加密密鑰給傳輸過去。于是你用 RSA 技術生成了一對 k1、k2,你把 k1 用明文發送了出去,路經有人或許會截取,但是沒有用,k1 加密的數據需要用 k2 才能解密。而此時,k2 在你自己的手里。k1 送達目的地后,目的地的人會去準備一個接下來用于對稱加密傳輸的密鑰 key,然后用收到的 k1 把 key 加密了,把加密好的數據傳回來。路上的人就算截取到了,也解密不出 key。等到了你自己手上,你用手上的 k2 把用 k1 加密的 key 解出來,現在全教室就只有你和你的目的地擁有 key,你們就可以用 AES 算法進行對稱加密的傳輸啦!這時候你和目的地的通訊將無法再被任何人竊聽!
當然,這時候你可能會問兩個問題。
既然 非對稱加密 可以那么安全,為什么我們不直接用它來加密信息,而是去加密 對稱加密 的密鑰呢?
這是因為 非對稱加密 的密碼對生成和加密的消耗時間比較長,為了節省雙方的計算時間,通常只用它來交換密鑰,而非直接用來傳輸數據。
使用 非對稱加密 是完全安全的嗎?
聽起來確實是挺安全的,但實際上,還有一種更惡劣的攻擊是這種方法無法防范的,這就是傳說中的“中間人攻擊”。我們繼續讓你坐在教室里傳小紙條。現在你和目的地上途徑一個中間人,他有意想要知道你們的消息。由于這個描述比較復雜,我們將你稱為 A,你的目的地稱為 B,而中間人稱為 M。當你要和 B 完成第一次密鑰交換的時候,途徑了 M。M 知道你要進行密鑰交換了,它把小紙條扣了下來,假裝自己是 B,偽造了一個 key ,然后用你發來的 k1 加密了 key 發還給你,你以為你和 B 完成了密鑰交換,實際上你是和 M 完成了密鑰交換。同時 M 和 B 完成一次密鑰交換,讓 B 誤以為和你完成了密鑰交換。現在,由 A -> B完整的加密,變成了 A(加密連接1) -> M(明文)->B(加密連接2)的情況了。這時候 M 依然可以知道 A 和 B 傳輸中的全部信息。
對于這種事,我們似乎很難找到一個解決方法來解決這個問題,除非我們能從源頭保證,你密鑰交換的對象是安全的。這時候我們就要認識互聯網 HTTPS 和你傳紙條的微妙區別了。你傳紙條時,你和你的目的地的關系幾乎是對等的。而你訪問網站時,你訪問的對象通常是一個比較大的服務供應商,他們有充沛的資源,也許可以證明他們的合法性。
這時候我們會引入一個第三方叫做 CA。CA 是一些非常權威的專門用于認證一個網站合法性的組織。服務商可以向他們申請一個證書,使得他們建立安全連接時可以帶上 CA 的簽名。而 CA 的安全性由操作系統或瀏覽器來認證。你的 Windows、Mac、Linux、Chrome、Safari 等會在安裝時帶上一個他們認為安全的 CA 證書列表。如果和你建立安全連接的人帶著這些人的簽名,那么認為這個安全連接是安全的,沒有遭到中間人攻擊。
CA 證書通常情況下是安全的。因為一旦某個 CA 頒發出的某個證書被用于了非法用途,瀏覽器和操作系統一般會通過更新將整個 CA 頒發過的全部證書全部視為不安全。這使得 CA 通常在頒發證書時是比較小心的。
所以通過 對稱加密 + 非對稱加密 + CA認證 這三個技術混合在一起,才使得 HTTP 的后面加上了一個 S —— Security。實際上 HTTPS 的協議比我這里描述的更復雜一些,我這里說的主要是基本的實現原理。因為其中任何一環稍有閃失,就會使得整個加密都將變得不安全。這也是為什么 HTTPS 的加密協議從SSL 1.0 升級到 SSL 3.0 再被 TLS 1.0 現在被 TLS 1.2 取代,其背后都是一環環細節上的修改,以防任何地方的閃失。
但即使如此,你的 HTTPS 盡可能的保證了你傳輸的安全,但這種安全也不是絕對的。比如 CA 證書出了問題被用于了中間人攻擊,在短期內,你的安全將會陷入直接的麻煩直到瀏覽器或操作系統重新更新了你的 CA 列表或者你手動調整了這個列表。但大多情況下不必杞人憂天,它基本上是安全的。
當然了,路由也可以選擇直接丟包,它看不到的,也不讓你看到。
來自:http://heckpsi.com/archives/986