(點選上方公號,快速關註我們)
編譯:伯樂線上/tsteho
密碼學可能是一個難以理解的主題。它充滿了數學證明。除非你真的需要開發密碼系統,否則,如果你只想從宏觀的角度瞭解密碼學,你並不需要理解這些複雜的內容。
如果你抱著能夠建立下一個 HTTPS 協議的期望開啟這篇文章,我不得不遺憾地表示只有信鴿是不夠的。否則,煮一些咖啡,享受這篇文章吧。
Alice,Bob 和信鴿?
你在網際網路上的任何活動(閱讀這篇文章,在亞馬遜上買東西,上傳貓咪的圖片)都歸結為向伺服器傳送訊息和從伺服器接收訊息。
這麼講聽起來可能有點抽象,因此,我們不妨假設這些資訊是透過信鴿傳遞的。我明白這麼假設顯得很隨意,但請相信我:HTTPS 的工作原理就是這樣的,只是快得多。
本文中我們並不會使用,伺服器,客戶端和駭客這樣的術語,取而代之的是,我們會依次使用人名 Alice、 Bob 和 Mallory來代替它們。如果你不是第一次嘗試理解密碼概念,你可以認出這些名字,因為它們被廣泛用於技術文獻中。
一次簡單的通訊
如果 Alice 想要給 Bob 傳遞一條資訊,她將資訊綁在信鴿的腿上,然後讓信鴿傳給 Bob。Bob 收到資訊,讀取資訊。一切都正常。
但要是 Mallory 途中攔截了 Alice 的信鴿,並且改變了資訊的內容?Bob 無法知道 Alice 傳送的資訊在傳遞途中被修改了。
這就是 HTTP 的工作原理。挺可怕的,對吧?我不會透過 HTTP 協議來傳送我的銀行憑證,你也不應該這麼做。
一個密令
那如果 Alice 和 Bob 都很機靈呢。他們同意將使用密令來寫資訊。他們將字母表中的每個字母偏移 3 個位置。比如:D -> A, E -> B, F -> C。明文“secret message”將轉換成“pbzobq jbppxdb”。
現在,如果 Mallory 攔截了信鴿,她既不能把資訊改變成一些有意義的資訊,也不能明白資訊裡說的內容,因為她不知道密令。但是Bob可以簡單地反嚮應用密令(A -> D, B -> E, C -> F)將資訊解密。密文“pbzobq jbppxdb”將被解密回“secret message”。
大功告成!
這被稱為對稱金鑰密碼術,因為當你知道如何加密一條資訊,你也知道如何給資訊解密。
我在上面介紹的密令通常被稱為凱撒密碼。在現實生活中,我們使用更高階和複雜的密令,但是主要思路是相同的。
我們如何決定金鑰是什麼?
如果只有傳送方和接收方知道金鑰,對稱金鑰密碼術是很安全的。在凱撒密碼中,金鑰是一個偏移值,這個偏移值決定每個字母應該偏移多少。在我們的例子中,我們使用的偏移值是 3,但是也能是 4 或者 12。
不過這麼設計會有個問題:在用信鴿傳遞資訊之前,如果 Alice 和 Bob 之前從沒見過,他們沒有安全的方式建立一個金鑰。如果他們將金鑰包含在資訊之中,Mallory 將攔截資訊並且發現金鑰。後果就是:無論 Alice 和 Bob 傳送的資訊是否加密,Mallory 都能讀取或者改變攔截到的資訊。
這是一個典型的中間人攻擊例子。避免它的唯一方法是改變之前的密碼系統。
攜帶盒子的信鴿
所以 Alice 和 Bob 想出了一個更好的系統。當 Bob 想要傳送資訊給 Alice 時,Alice 將遵照下麵的流程:
-
Bob 向 Alice 傳送一隻信鴿,信鴿不攜帶任何資訊。
-
Alice 將這隻信鴿傳回給 Bob,信鴿攜帶一隻開著鎖的盒子以及金鑰。
-
Bob 把資訊放到盒子裡,將鎖鎖上,將盒子傳送給 Alice。
-
Alice 收到盒子,使用金鑰開啟盒子,讀取資訊。
透過這種方式傳遞資訊,Mallory 不可能透過攔截信鴿的方式來改變資訊,因為她沒有金鑰。當 Alice 想要向 Bob 傳送資訊時,遵循相同的流程。
Alice 和 Bob 剛剛使用了通常所說的非對稱金鑰密碼術。之所以稱它為非對稱,是因為即使你可以加密一條資訊(鎖上盒子)但你也不能將它解密(開啟鎖住的盒子)。
我怎麼信任這個盒子?
如果你夠仔細的話,你可能已經意識到我們仍然有一個問題。當 Bob 收到那個開著的盒子時,他如何確信這是來自 Alice 的盒子,而不是 Mallory 攔截信鴿後,將來自於 Alice 的盒子替換成 Mallory 自己設定了金鑰後的盒子。
Alice 決定對盒子進行數字簽名,透過這種方式,當 Bob 收到盒子,他透過核對簽名的一致性來確定盒子是否來自 Alice。
有些人可能就會想 Bob 如何識別 Alice 的簽名?不錯的問題。Alice 和 Bob 也有同樣的疑問。因此他們決定讓 Ted 對盒子進行數字簽名,而不是 Alice。
Ted 是誰?Ted 是一個著名且值得信賴的人。每個人都可以從Ted 那裡獲得簽名,每個人都相信Ted 只會為合法的人提供盒子的數字簽名服務。
只有當Ted 確信正在請求簽名的人是 Alice,Ted 才會為 Alice 提供盒子數字簽名的服務。因此 Mallory 不能再像之前那樣攔截 Alice 的盒子、替換盒子後傳送給 Bob 了,因為 Bob 會發現這個盒子在 Ted 那進行數字簽名的是 Mallory,而不是 Alice。
Ted 在技術術語中通常被稱為證書頒發機構,你閱讀這篇文章所使用的瀏覽器安裝著各種證書頒發機構的簽名。
因此當你第一次連線到一個網站,你信任它的盒子,因為你信任 Ted,而 Ted 告訴你這個盒子是合法的。
盒子太重了
Alice 和 Bob 現在有了一個可靠的通訊系統,但是他們意識到和僅僅攜帶資訊的信鴿相比,攜帶盒子的信鴿太慢了。
他們決定只在傳遞金鑰的時候使用盒子的方法(非對稱密碼術),加密資訊使用對稱密碼術(記得之前提到的凱撒密碼?)。
這樣的話可謂兩全其美:非對稱密碼術的可靠性和對稱密碼術的效率都有了。
在現實世界中,“信鴿”的傳送速度都很快,但儘管這麼講,使用非對稱密碼技術加密訊息比使用對稱密碼技術慢,所以我們只使用它來交換加密金鑰。
現在你知道了HTTPS的工作原理,你的咖啡也該煮好了。去喝吧,這是你應得的。
【關於投稿】
如果大家有原創好文投稿,請直接給公號傳送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章連結
② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
覺得本文有幫助?請分享給更多人
關註「演演算法愛好者」,修煉程式設計內功