密碼技術簡明教程(三):證書和TLS
在第一篇 和第二篇 中我們學到了 使用對稱加密加密資訊,非對稱加密配送金鑰,使用雜湊確認檔案沒有被篡改,使用訊息認證碼確保知曉密碼的才能傳送訊息,使用數字簽名來證明訊息的傳送者。
那麼,如果我們在網際網路上訪問一個網站進行通訊的時候,使用非對稱加密進行金鑰配送時,怎麼確保對方就是對方呢?也就是說,怎麼確認我們收到的所謂的Alice
的公鑰就真的是Alice
的公鑰呢?
答案是,對公鑰使用數字簽名。
證書
因為大家都有公鑰,於是世界上各大商家就形成了一個組織,這個組織負責對公鑰進行簽名。只要是這個組織簽名過的公鑰我們都信任。這個組織就叫CA(Certification Authority)
。
舉個例子,如果Alice
要向Bob
傳送密文,那麼首先Bob
將它的證書傳送給Alice
。
首先證書有兩部分組成:
-
Bob
的公鑰 -
CA
使用CA
的私鑰生成的數字簽名
Alice
接收到證書之後,首先使用CA
的公鑰對數字簽名進行確認,如果發現沒有問題,確實
是CA
簽發的證書,那麼接下來,就是用Bob
的公鑰對訊息進行加密,然後傳送給Bob
。Bob
再使用自己的私鑰進行解密,就可以得到Alice
發出的明文。
如果全世界只有一個CA
,由它來簽發所有的證書,那麼它肯定忙不過來,而且也會由於處於壟斷地位而搞各種么蛾子,因此,CA
組織一般都是樹狀結構,是分層的,而最頂層的CA
就叫 根證書(Root CA)。
TLS
TLS 就是我們之前學到的幾種密碼工具的組合,舉個例子,我們日常所使用的HTTP協議,他是明文協議,HTTP請求大概長這樣:
GET / HTTP/1.1 Host: www.example.com
而響應大概長這樣:
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close <html> <head> <title>An Example Page</title> </head> <body> <p>Hello World, this is a very simple HTML document.</p> </body> </html>
可以看到,他們其實就是人類可讀的字元,所以對HTTP協議進行中間人攻擊,就可以獲取所傳輸的一切,因此我們 需要一種能夠相容HTTP協議(HTTP應用這麼廣,不可能一下子把它廢掉),但是又能進行加密的技術,它就是TLS。
TLS詳細可以參考這裡:https://en.wikipedia.org/wiki/Transport_Layer_Security
TLS的工作流程是:
ClientHello ServerHello
可以發現