我和小宇早戀了,上課的時候老說話。
老師把我們的座位分得很遠,我在第一排,她在最後一排,我們中間隔了很多人。
但我們還是想通過傳紙條的方式交流。
我們中間的那些同學,雖然壞心思比較多,但好在可以保證將紙條傳遞到位,於是我們用傳紙條的方式,一直祕密交流著感情。
但好景不長,我們漸漸發現,中間這些同學特別不靠譜,出現了以下兩種惡劣的行為:
偷看紙條,把我們的小甜蜜作為他們飯後的談資。
篡改內容,讓我們之間產生了好多誤會。
這還了得,我必須得想個辦法才行!
單鑰匙鎖
於是我發明了一個盒子,並且給這個盒子配了一把鎖和一把鑰匙。
這把鎖與普通的鎖不太一樣,解鎖需要鑰匙,同時上鎖也需要鑰匙。
我把這個鑰匙複製了一份,給到小宇,這樣我每次給她寫完小紙條之後,都把紙條放在盒子裡,用鑰匙把它鎖起來。
小宇收到這個盒子後,用鑰匙解鎖,才能拿出裡面的紙條。
同時如果小宇想給我回紙條時,也需要把紙條放在盒子裡,並且用鑰匙加鎖,再傳給我。
這樣,由於中間的同學沒有鑰匙,就無法偷窺裡面的內容了,也無法篡改裡面的內容,問題完美解決。
但好景又不長,由於之前我把鑰匙給小宇時,也是通過同學傳遞過去的,有個同學當時就偷偷又複製了一份,因此拿到了一個鑰匙。
於是他每次收到我傳給小宇的盒子的時候,就先用鑰匙解鎖,偷看內容,有的時候甚至還修改內容,放回盒子,然後再用鑰匙鎖起來。
這還了得,我必須得再想個辦法才行!
雙鑰匙鎖 - 防篡改
我絞盡腦汁,通宵達旦了好幾天,終於發明出了一把特別神奇的鎖。
與這個鎖相對應的有兩把不同的鑰匙 A 和 B,神奇的地方就在於,用鑰匙 A 加鎖,必須用鑰匙 B 才能解鎖。反過來用鑰匙 B 加鎖,必須用鑰匙 A 才能解鎖。
我對我的這個發明非常滿意!感覺可以申請專利了!
我給這個鎖起了個名字叫雙鑰匙鎖,那自然之前那個簡單的鎖,就叫單鑰匙鎖。
而雙鑰匙鎖這種加解鎖的方式,我給起了個名字,叫非對稱加解鎖,自然,那個單鑰匙鎖對應的方式,就叫對稱加解鎖咯。
有了這個發明,我只需要把鑰匙 B 給小宇,我每次寫紙條時先用鑰匙 A 進行加密,然後盒子到了小宇那裡,她只需要用鑰匙 B 解密,即可看到我的內容了。
這個鑰匙 B 被人複製了一份也沒關係,壞人只能用鑰匙 B 開啟盒子偷看我的內容,但是他如果想篡改內容,必須用鑰匙 A 才能把盒子鎖住,而鑰匙 A 一直在我手裡,從來沒有傳遞過,沒人知道。
當然,壞人也可以用鑰匙 B 把盒子鎖住,但用 B 鎖住的盒子,只能用 A 去解鎖,所以如果小宇用自己手裡的 B 解鎖時,發現解不開,就知道內容被人篡改了。
現在,內容篡改的問題就完美解決了。
還有內容被偷看的問題還沒解決,也就是內容洩漏。
雙鑰匙鎖 - 防洩漏
我靈機一動,想到了辦法。
我發現,小宇那邊已經有了鑰匙 B,如果小宇用 B 去加鎖,只有鑰匙 A 能解鎖,而鑰匙 A 只有我這裡有,這樣小宇用鑰匙 B 加鎖的紙條,就沒有任何人能看到並且篡改了!
就著這個思路,因為我們完全是對稱的關係,所以只要小宇那邊再造一個類似的神奇的鎖,然後分配兩把鑰匙 C 和 D。
然後小宇把鑰匙 D 給我,自己保留鑰匙 C,這樣我只要用鑰匙 D 加鎖我的內容,就只有小宇能解開了!
這樣,就保證了雙向的通訊安全!中間的壞同學們既無法閱讀我們的內容,也無法篡改我們的內容,因為會被我們發現。
但好景又不長,我們發現,這個雙鑰匙鎖由於設計的太過複雜,導致加鎖解鎖的效率實在是太低了,每次傳一個紙條都要費好大勁加鎖再解鎖,極大降低了我們每天交流的次數,很不爽。
這還了得,我必須得想個辦法才行!
單雙鑰匙鎖相互配合
我記得當初用那個單鑰匙鎖的時候,效率就挺高的,只是因為傳送鑰匙的過程中容易被壞人偷看到,複製一份出來,就可以監聽和篡改我們後續的通訊了。
那我們能不能用雙鑰匙鎖的安全性,把單鑰匙鎖的鑰匙安全地傳送給對方,然後之後再用單鑰匙鎖,高效率地通訊。這樣,安全性和效率就都有了保證!
我趕緊想出了一個絕妙的方案!
1. 由小宇設計一個雙鑰匙鎖,配兩把鑰匙 C 和 D,然後把鑰匙 D 給我。
2. 我這邊準備一個單鑰匙鎖,配一個鑰匙 M,把它放在盒子裡,用小宇給我的鑰匙 D 加鎖,傳給小宇。
3. 傳送過程中,由於鑰匙 D 加鎖的盒子只能用鑰匙 C 解鎖,所以中間人無法檢視和篡改內容,最終鑰匙 M 被安全傳送到小宇那邊。
4. 此時,我們雙方都有了鑰匙 M 和與之對應的單鑰匙鎖,而且這個鑰匙 M 誰都不知道。
5. 在此之後,我們用鑰匙 M 去加密我們的資訊,對方用鑰匙 M 解密我們的資訊,達成了安全通訊的條件。
簡單說就是,小宇給了我把鑰匙 D,我用 D 加鎖我的 M,傳給小宇,之後我們用鑰匙 M 進行對稱加解鎖的方式進行通訊。
當然,中間的壞蛋,可以在小宇給我鑰匙 D 的時候,偷偷換成別的鑰匙 E,但我用 E 加鎖我的鑰匙 M 之後,小宇是無法用鑰匙 C 解鎖的,也就知道中間有人動了手腳,那我們就停止我們的通訊。
也就是說,中間人可以阻止我們的通訊,但是卻再也無法偷窺和閱讀我們的通訊內容了。
太絕了!我們居然在中間人完全不可靠的通訊鏈路上,實現了安全的通訊,這簡直不可思議!
但好景又不長。
有個又壞又聰明的壞蛋,居然也研究出了這種雙鑰匙鎖的技術!
這些壞蛋給自己也準備了一個雙鑰匙鎖,並且配置了兩把鑰匙 X 和 Y。
此時他在我們原來的通訊方式上,做了這麼個事。
1. 由小宇設計一個雙鑰匙鎖,配兩把鑰匙 C 和 D,然後把鑰匙 D 給我。
2. 這個人沒把鑰匙 D 給我,而是把自己造的鑰匙 Y 給了我,但我以為這是小宇給我的呢。
3. 我這邊準備一個單鑰匙鎖,配一個鑰匙 M,把它放在盒子裡,用小宇給我的鑰匙(其實是壞蛋給我的鑰匙 Y)加鎖,傳給小宇。
4. 這個人收到加鎖後的盒子,用自己的鑰匙 X 輕鬆解了鎖,因為這個鎖是被 Y 鎖的嘛~解鎖後取出裡面的鑰匙 M,複製了一份,然後再用小宇的鑰匙 D 加鎖。
5. 小宇用 C 解開了鎖,得到裡面的鑰匙 M,這個的確是我給的,但小宇不知道此時已經被壞人知道了,與此同時我也不知道這個事。
6. 於是我們用鑰匙 M 加鎖解鎖通訊,壞蛋也同樣用鑰匙 M 來偷窺或篡改我們的資訊。
簡單說,就是,我以為我是用小宇的鑰匙加密,但卻是壞蛋的。小宇以為是我用她的鑰匙加密後傳給她的 M,因為她解得開,但卻是壞蛋偽裝的。我們雙方都不知情。
壞蛋也真是卷啊,這麼精妙的設計也能想出來,只是為了偷窺我和小宇的小紙條,果然八卦是人類的第一生產力。
這肯定不行,我必須又得想個辦法才行。
找班長做公證
我苦思冥想,找到了一個解決思路。
首先我們至少有一次,就是第一次傳輸的那把鑰匙,是無法進行加密的,會被中間的所有人看到,這個是無法避免的,否則就一直套娃了。
但是我們能不能做到,可以讓對方看到,但卻無法篡改呢?
也就是說,壞蛋傳給我假鑰匙 Y,我可以知道這個是壞蛋的呢?
只靠我們兩個,幾乎不可能,於是我求助了班長。
我讓班長也準備了一個雙鑰匙鎖,然後配置了兩把鑰匙 J 和 K,然後把鑰匙 K 公開讓所所有人都知道。
小宇在第一次準備給我鑰匙 D 時,不再直接給我了,而是找班長,把鑰匙 D 放在一個盒子裡,讓班長用自己的鑰匙 J 給加鎖。
然後小宇把這個用鑰匙 J 加好鎖的盒子傳給我,我用班長公開的鑰匙 K 解鎖盒子,就可以得到小宇的鑰匙 D 了。
這樣,中間的壞蛋可以用公開的鑰匙 K 把盒子開啟,看到小宇準備給我的鑰匙 D。
但是,他們卻無法把自己偽造的鑰匙 M 傳給我,因為要想加鎖這個盒子,必須有鑰匙 J 才行,而鑰匙 J 只有班長知道。
也就是說,目前這個內容,中間的壞蛋們只能看,不能修改了!
如果不能修改,我就能成功用小宇給我的真正的鑰匙 D 加鎖我們之後要通訊用的鑰匙 M,於是這個鑰匙 M 就被安全地傳給了小宇,我們之後就可以用這個誰也不知道的鑰匙 M,和配套的單鑰匙鎖,愉快地聊天了!
可是如果班長同壞蛋勾結,把 J 洩漏或者賣給了壞蛋怎麼辦呢?那沒轍,說明他不配當班長!
這麼多鑰匙傻傻分不清了
這個環節涉及到很多鑰匙
我的單鑰匙 M:用來之後我和小宇對稱加鎖方式通訊用的,需要想辦法安全傳給小宇
小宇的雙鑰匙 CD:用來讓我安全把 M 傳給她,做法是把公開的鑰匙 D 傳給我,我用鑰匙 D 加鎖我的 M,這樣只有她才能用自己的保金鑰匙 C 解開,中間人無法得知。
壞蛋的雙鑰匙 XY:用來傳給我偽造的鑰匙 Y 讓我誤以為這是小宇傳給我的鑰匙 D。
班長的雙鑰匙 JK:用來加鎖小宇的鑰匙 D,防止中間的壞蛋篡改這個值。
這在安全領域,分別對應對稱加密,非對稱加密。
單鑰匙就是對稱加密,對稱加密的速度很快,可以用於傳輸過程中的資料加密,防止中間人檢視和篡改資訊。但是如何將對稱加密的祕鑰安全傳遞過去,個問題。
雙鑰匙就是非對稱加密,非對稱加密的速度慢,可以用於加密少量資料,同時也可以用於簽名防止篡改,為什麼呢?看後面。
非對稱加密的祕鑰中,公開讓別人知道的就是公鑰,比如小宇的鑰匙 D 或班長的鑰匙 K 等。
留在自己這裡不讓別人知道的就是私鑰,比如小宇的鑰匙 C 或班長的鑰匙 J 等。
既可以用私鑰加密資料,公鑰解密資料。也可以用公鑰加密資料,私鑰解密資料。
公鑰加密,私鑰解密,這個叫加密,是為了保證內容安全,因為私鑰只有自己知道,是為了保證這個資訊不被中間人解開。
私鑰加密,公鑰解密,這個叫簽名,是為了防止內容被篡改,因為公鑰所有人都知道,所有人都能看到這個資訊做驗證。
但是,如果想篡改,就必須得篡改原文資訊後,用私鑰加密,才能得到原來的效果,可惜私鑰是不公開的。
還有一種不可逆的雜湊函式,這個叫摘要,是無法解密的,這個之後再說。
在剛剛的環節中,首先小宇讓班長用私鑰 J 加密自己的公鑰 D,傳給我,這是私鑰加密公鑰解密,這個目的就是簽名,防止公鑰 D 在傳輸過程中被別人篡改。
我得到了公鑰 D 之後,加密我的對稱加密的祕鑰 M,傳給小宇,這是公鑰加密私鑰解密,這個目的是加密,為了讓中間人不知道我的 M 是什麼。
當然,我們之後的資料傳輸過程,也可以用這種非對稱加密的方式玩,但可惜,非對稱加密的複雜度非常高,效能非常低,因此僅僅適合這個傳遞祕鑰 M 的過程,資料量很小,而且僅僅一次。
再之後的傳輸,就通過我們協商好的對稱祕鑰 M 進行傳輸,這個也是加密,與公鑰加密私鑰解密的目標是一致的,只不過適合的場景不同,對稱加密的效率比非對稱加密高出好幾個數量級。
HTTPS
我和小宇傳紙條這個過程,就是 HTTPS 的工作原理。
哦不對,這句話重說一遍,這個破玩意,就是 HTTPS。
我就是客戶端,小宇就是服務端,班長就是 CA 機構,中間那些壞蛋同學就是傳輸鏈路,用以標明傳輸鏈路很不靠譜,有很多中間人想要搞破壞,或者偷窺我們的資訊。
只不過,HTTPS 的細節更多些,但大體的思路和我們今天傳紙條是一致的。
之後給大家出,通過抓包方式學習 HTTPS 的細節過程,包我已經抓好了。
今天大家只關注這個 HTTPS 的思想過程,後面帶大家學習 TLS 協議細節,以及 CA 證書的組成即驗證方式。