天天看點

“HTTPS”安全在哪裡?

背景

最近基于興趣學學習了下 HTTPS 相關的知識,在此記錄下學習心得。

在上網擷取資訊的過程中,我們接觸最多的資訊加密傳輸方式也莫過于 HTTPS 了。每當通路一個站點,浏覽器的位址欄中出現綠色圖示時,意味着該站點支援 HTTPS 資訊傳輸方式。我們知道 HTTPS 是我們常見的 HTTP 協定與某個加密協定的混合體,也就是 HTTP+S。這個 S 可以是 TLS(安全傳輸層協定)、也可以是 SSL(安全套接層),不過我更認可另一個抽象概括的說法,HTTP+Security。不過要談論 HTTPS 為何安全,還得從 HTTP 為何不安全說起。

假設你現在正坐在教室裡上課,現在你非常想和走道旁的迷人的 TA 說一些話,一般這個時候你會用“傳紙條”的方式來交流。而這個方式和 TCP/IP 協定基本的工作模式十分相像:

通過小動作引起對方注意;

對方以多種可能的方式(注視、肢體語言等)回應于你;

你确認對方感覺到你後,将紙條傳給對方;

對方閱讀紙條;

對方給予你閱讀後的反應;

怎麼樣,這個流程是不是很熟悉?

如果你要傳遞紙條的 TA 距離你很遠怎麼辦?HTTP 協定就是指你在紙條上寫明你要傳給的 TA 是誰,或者 TA 的座位在哪,接着隻需要途徑的同學拿到紙條後根據紙條上的訓示依次将紙條傳過去就 OK 了。

“HTTPS”安全在哪裡?

這個時候問題來了:途徑的同學完全可以觀看并知道你在紙條上寫了什麼。

“HTTPS”安全在哪裡?

這就是 HTTP 傳輸所面臨的問題之一:中間人攻擊,指消息傳遞的過程中,處在傳遞路徑上的攻擊者可以嗅探或者竊聽傳輸資料的内容。

加密

HTTPS 針對這個問題,采用了“加密”的方式來解決。最著名原始的加密方法就是對稱加密算法了,就是雙方約定一個暗号,用什麼字母替換什麼字母之類的。現在一般采用一種叫 AES(進階加密算法)的對稱算法。

“HTTPS”安全在哪裡?

對稱加密算法既指加密和解密需要使用的密鑰 key 是一樣的。

AES 在數學上保證了,隻要你使用的 key 足夠長,破解幾乎是不可能的(除非光子計算機造出來了)

我們先假設在沒有密鑰 key 的情況下,密文是無法被破解的,然後再回到這個教室。你将用 AES 加密後的内容噌噌噌地寫在了紙條上,正要傳出去的時候你突然想到,TA 沒有 key 怎麼解密内容呀,或者說,應該怎麼把 key 給TA?

如果把 key 也寫在紙條上,那麼中間人照樣可以破解竊聽紙條内容。也許在現實環境中你有其他辦法可以把 key 通過某種安全的管道送到 TA 的手裡,但是網際網路上的實作難度就比較大了,畢竟不管怎樣,資料都要經過那些路由。

于是聰明的人類發明了另一種加密算法——非對稱加密算法。這種加密算法會生成兩個密鑰(key1 和 key2)。凡是 key1 加密的資料,key1 自身不能解密,需要 key2 才能解密;凡事 key2 加密的資料,key2 自身不能解密,隻有 key1 才能解密。

目前這種算法有很多中,最常用的是 RSA。其基于的數學原理是: 兩個大素數的乘積很容易算,但是用這個乘積去算出是哪兩個素數相乘就很複雜了。好在以目前的技術,分解大數的素因确實比較困難,尤其是當這個大數足夠大的時候(通常使用2的10次方個二進制位那麼大),就算是超級計算機,解密也需要非常長的時間。

現在就把這種非對稱加密的方法應用在我們教室傳紙條的場景裡。

你在寫紙條内容之前先用 RSA 技術生成了一對密鑰 k1 和 k2。

你把 k1 用明文傳了出去,路經也許有人會截取,但是沒有用,k1 加密的資料需要 k2 才可以破解,而 k2 在你自己手中。

k1 傳到了目的人,目的人會去準備一個接下來準備用于對稱加密(AES)的傳輸密鑰 key,然後用收到的 k1 把 key 加密,傳給你。

你用手上的 k2 解出 key 後,全教室隻有你和你的目的人擁有這個對稱加密的 key,你們倆就可以盡情聊天不怕竊聽啦~

這裡也許你會有問題,為什麼不直接用非對稱加密來加密資訊,而是加密 AES 的 key 呢?

因為非對稱加密和解密的平均消耗時間比較長,為了節省時間提高效率,我們通常隻是用它來交換密鑰,而非直接傳輸資料。

然而使用非對稱加密真的可以防範中間人攻擊嗎?

雖然看上去很安全,但是實際上卻擋不住可惡的中間人攻擊。

“HTTPS”安全在哪裡?

假設你是 A,你的目的地是 B,現在要途徑一個惡意同學M。

“HTTPS”安全在哪裡?

中間人的惡意之處在于它會僞裝成你的目标。

當你要和 B 完成第一次密鑰交換的時候,M 把紙條扣了下來,假裝自己是B并僞造了一個 key,然後用你發來的 k1 加密了 key 發還給你。

你以為你和 B 完成了密鑰交換,實際上你是和 M 完成了密鑰交換。

同僚 M 和 B 完成一次密鑰交換,讓 B 以為和 A 你完成了密鑰交換。

現在整體的加密流程變成了A(加密連結1)->M(明文)->B(加密連結2)的情況了,這時候 M 依然可以知道A和B傳輸的全部消息。

這個時候就是展現 HTTPS 和傳紙條的差別了。在教室裡,你是和一位與你身份幾乎對等的的對象來通信;而在通路網站時,對方往往是一個比較大(或者知名)的服務者,他們有充沛的資源,或許他們可以向你證明他們的合法性。

此時我們需要引入一個非常權威的第三方,一個專門用來認證網站合法性的組織,可以叫做 CA(Certificate Authority)。各個網站服務商可以向 CA 申請證書,使得他們在建立安全連接配接時可以帶上 CA 的簽名。而 CA 得安全性是由作業系統或者浏覽器來認證的。

你的 Windows、Mac、Linux、Chrome、Safari 等會在安裝的時候帶上一個他們認為安全的 CA 證書清單,隻有和你建立安全連接配接的網站帶有這些CA的簽名,作業系統和浏覽器才會認為這個連結是安全的,否則就有可能遭到中間人攻擊。

一旦某個 CA 頒發的證書被用于的非法途徑,那麼這個 CA 之前頒發過的所有證書都将被視為不安全的,這讓所有 CA 在頒發證書時都十分小心,是以 CA 證書在通常情況下是值得信任的。

總結

使 HTTP 後面增加一個S(Security)的技術,正是 對稱加密 + 非對稱加密 + CA 認證 這三種技術的混合體。當然這個主要是 HTTPS 的基本原理,真正實際中的 HTTPS 的協定是比以上的描述更為複雜一些的,并且其中任何一步稍有閃失,整個流程都将不再安全。

這也是為什麼 HTTPS 協定從 SSL 1.0更新到 SSL 3.0,再被 TLS 1.0 現在被 TLS 1.3取代,其背後都是一個個細節上的優化,以防有任何閃失。

TLS 協定相比 SSL 協定增加了傳輸層的安全保證。

轉自 http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1074

QQ:519841366

本頁版權歸作者和部落格園所有,歡迎轉載,但未經作者同意必須保留此段聲明,

且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利

繼續閱讀