協議森林17 我和你的悄悄話 (SSL/TLS協議)

Vamei發表於2016-10-08

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。

 

TLS名為傳輸層安全協議(Transport Layer Security Protocol),這個協議是一套加密的通訊協議。它的前身是SSL協議(安全套接層協議,Secure Sockets Layer)。這兩個協議的工作方式類似,但TLS協議針對SSL協議進行了一些改善。SSL/TLS協議利用加密的方式,在開放的網際網路環境中實現了加密通訊,讓通訊的雙方可以安心的說悄悄話。。

 

加密 

SSL協議的基礎是加密技術。加密和解密是自古就有技術了。比如說古代的男女偷偷發生私情,不能被相互之間有血海深仇的兩個家族知道。男孩問女孩要不要一起私奔。女孩第二天傳來答覆,上面寫著:

K FQ

男孩拿著這串字元翻來覆去想了半天,沒明白女孩的意思,就以為女孩不願放棄優渥的生活和他私奔。直到十年後,男孩忽然靈光一閃,發現如果把每個字母都替換成字母表上提前兩個的字母的話,這三個字元就變成了:

I DO

 

這種加密方法是將原來的某種資訊按照某個規律打亂。打亂的方式稱為加密演算法,而打亂過程中的引數就叫做金鑰(cipher code)。上面女孩的加密方式是把原字母替換為字母表上後固定位的字母。而金鑰就是固定的位數2了。發出資訊的人根據金鑰來給資訊加密,而接收資訊的人利用相同的金鑰,來給資訊解密。就好像一個帶鎖的盒子。傳送資訊的人將資訊放到盒子裡,用鑰匙鎖上。而接受資訊的人則用相同的鑰匙開啟。加密和解密用的是同一個金鑰,這種加密稱為對稱加密(symmetric encryption)。

 

如果一對一的話,那麼兩人需要交換一個金鑰。理論上,如果金鑰絕對安全,而且加密演算法絕對複雜的話,對稱加密是很難破解的。但通訊雙方很難絕對保證金鑰的安全。一旦有其他人竊取到金鑰,那麼所有通訊都變得不安全了。特別在一對多的話,如果共用同一套金鑰,那麼某一方通訊的破解就意味著所有通訊的破解。二戰中盟軍的情報戰成果,很多都來自於破獲這種對稱加密的金鑰。盟軍破解了某個德國特工的加密手法,那麼也就瞭解到納粹總部的加密手法了。

二戰中德軍的傳奇加密機:Enigma

 

對稱加密的薄弱之處在於給了太多人的鑰匙。如果換一種思路,只給特工鎖,而總部保有鑰匙,那就容易了。特工將資訊用鎖鎖到盒子裡,誰也打不開,除非到總部用唯一的一把鑰匙開啟。只是這樣的話,特工每次出門都要帶上許多鎖,太容易被識破身份了。總部老大想了想,乾脆就把造鎖的技術公開了。特工,或者任何其它人,可以就地取材,按照圖紙造鎖,但無法根據圖紙造出鑰匙。鑰匙只有總部的那一把。上面的關鍵是鎖和鑰匙工藝不同。知道了鎖,並不能知道鑰匙。這樣,總部可以將“造鎖”的方法公佈給所有使用者。每個使用者可以用鎖來加密自己的信用卡資訊。即使被別人竊聽到,也不用擔心:只有總部才有鑰匙呢!非對稱加密中,給所有人用的鎖被稱為公鑰(public key),總部自己保留的鑰匙被稱為私鑰(private key)。這樣一種鑰匙和鎖分離的加密演算法就叫做非對稱加密(asymmetric encryption)。

 

非對稱加密

對稱加密的原理相對比較直觀,而非對稱加密聽起來就有些神奇。經過非對稱加密產生的密文,就算知道加密的方法,也無法獲知原文。實現了非對稱加密的經典演算法是RSA演算法。它來自於數論與計算機計數的奇妙結合。我們從下面的情境中體驗一下RSA演算法的妙處。

 

我是潛伏在龍鳳大酒樓的臥底。想讓下面資訊以加密的方式傳送到總部:

A CHEF HIDE A BED

廚子藏起來了一張床!這是如此的重要,需要立即通知總部。千萬重要的是,不能讓反革命的廚子知道。

 

第一步是轉碼,也就是將英文轉換成某個對應的數字。這個對應很容易建立,比如:

A B C D E F G H I
1 2 3 4 5 6 7 8 9

 

將上面的資訊轉碼,獲得下面的數字序列:


A CHEF HIDE A BED 1 3856 8945 1 254

這串數字完全沒有什麼祕密可言。廚子發現了這串數字之後,很容易根據數字順序,對應字母表猜出來。

 

為了和狡猾的廚子鬥智鬥勇,我們需要對這串數字進一步加密。使用總部發給我們的鎖,兩個數字:3和10。我們分為兩步處理。第一步是求乘方。第一個數字是3,也就是說,總部指示我們,求上面數字串的3次方:

原字串: 1   3   8   5   6   8   9   4   5   1   2   5   4

三次乘方: 1  27 512 125 216 512 729  64 125   1   8 125  64

第二步是求餘數。第二個上鎖的數字是10,將上面每個三次乘方除以10,獲得其餘數:

餘數: 1 7 2 5 6 2 9 4 5 1 8 5 4

 

將這串數字發回總部。中途被廚子偷看到,但一時不能瞭解其中的意思。如果還是像剛才一樣對應字母表的話,資訊是:

AGBEFBIDEAHED

這串字母完全不包含正常的單詞。

 

資訊到了總部。總部開始用神奇的鑰匙來解讀。這個鑰匙是3。在這個簡單的粒子裡,鑰匙不小心和之前鎖中的一個數字相同。但這只是巧合。複雜的情況下很容易讓鎖和鑰匙不同。解鎖過程也是兩步。第一步求鑰匙次的乘方,即3次方。第二步求它們除以10(鎖之一)的餘數。

加密資訊:1   7   2   5   6   2   9   4   5   1   8   5   4

三次乘方:1 343   8 125 216   8 729  64 125   1 512 125  64 (這裡用的是鑰匙的“3”)

除十得餘:1   3   8   5   6   8   9   4   5   1   2   5   4

正是我們傳送的資訊。對應字母表,總部可以立即知道原來的資訊。就此,我們簡單的體驗了RSA演算法的使用過程。鑑於這裡篇幅有限,這裡不再詳細解釋RSA演算法的原理。如果有興趣,可以參考我的另一篇文章:“不給力啊,老溼!”:RSA加密與破解

 

SSL協議

可以看到,非對稱加密從安全性上要強過對稱加密。但天下沒有免費的午餐。非對稱加密的運算成本同樣也比較高。為了兼顧效率和安全,SSL協議同時使用了非對稱和對稱加密。它用對稱加密演算法來加密資訊本身。但對於安全性比較脆弱的對稱加密金鑰,則採用非對稱加密的方式來傳輸。

 

SSL協議分為客戶端和伺服器端。通訊的核心步驟很簡單:

1. 雙方利用明文通訊的方式確立使用的加密演算法。

2. 利用非對稱演算法通訊,交換一個金鑰。

3. 該金鑰用於對稱加密演算法,加密接下來的通訊正文。

 

可以看到,SSL協議的關鍵是用一個非常安全的方式來交換一個對稱金鑰。交換的過程會比上面的描述更加複雜一些。

1. 客戶發起請求時,除了說明自己支援的非對稱加密演算法,還會附加一個客戶端隨機數(client random)。

2. 伺服器回覆請求時,會確定非對稱加密演算法和雜湊函式,並附上公鑰。此外,伺服器端還會在此次通訊中附加一個伺服器端隨機數(server random)。

3. 客戶端會產生第三個隨機數(Premaster secret),然後利用伺服器確定的非對稱加密演算法和公鑰來加密這個隨機數,再傳送給伺服器端。

4. 客戶端用自己的私鑰解密第三個隨機數。

4. 這樣,客戶端和伺服器端都知道了三個隨機數。雙方各自用商量好的雜湊函式從三個隨機數獲得對稱加密的金鑰。

即使明文通訊的時候,某些資訊被竊聽,但第三步的非對稱加密通訊部分可以保證竊聽者無法完整的獲得三個隨機數。這樣,竊聽者還是不知道對稱加密的金鑰是什麼。這樣,對稱加密的金鑰就在一個安全的環境中獲得了。為了進一步安全,伺服器的公鑰會包含在一個數字證書中傳送給客戶。這樣,客戶還可以通過數字證書來驗證伺服器的身份,以免伺服器本身出現問題。 

 

今年來使用越來越廣泛的HTTPS協議就是在SSL/TLS協議的基礎上進行通訊。HTTP協議在通訊過程中要經過多重路由,很容易被竊聽。經過SSL協議加密的資訊就算被竊聽,也只能被通訊目的地的人解讀,從而保證了資訊的安全。所以,如果所訪問的網站沒有使用HTTPS協議,那麼在輸入銀行賬號和密碼之類的敏感資訊時,就要三思而後行了。

 

當瀏覽器出現鎖的符號時,說明訪問的資源使用了HTTPS通訊

 

 

 

相關文章