做者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。html
TLS名爲傳輸層安全協議(Transport Layer Security Protocol),這個協議是一套加密的通訊協議。它的前身是SSL協議(安全套接層協議,Secure Sockets Layer)。這兩個協議的工做方式相似,但TLS協議針對SSL協議進行了一些改善。SSL/TLS協議利用加密的方式,在開放的互聯網環境中實現了加密通訊,讓通訊的雙方能夠安心的說悄悄話。。算法
SSL協議的基礎是加密技術。加密和解密是自古就有技術了。好比說古代的男女偷偷發生私情,不能被相互之間有血海深仇的兩個家族知道。男孩問女孩要不要一塊兒私奔。女孩次日傳來答覆,上面寫着:瀏覽器
K FQ安全
男孩拿着這串字符翻來覆去想了半天,沒明白女孩的意思,就覺得女孩不肯放棄優渥的生活和他私奔。直到十年後,男孩突然靈光一閃,發現若是把每一個字母都替換成字母表上提早兩個的字母的話,這三個字符就變成了:服務器
I DOdom
這種加密方法是將原來的某種信息按照某個規律打亂。打亂的方式稱爲加密算法,而打亂過程當中的參數就叫作密鑰(cipher code)。上面女孩的加密方式是把原字母替換爲字母表上後固定位的字母。而密鑰就是固定的位數2了。發出信息的人根據密鑰來給信息加密,而接收信息的人利用相同的密鑰,來給信息解密。就好像一個帶鎖的盒子。發送信息的人將信息放到盒子裏,用鑰匙鎖上。而接受信息的人則用相同的鑰匙打開。加密和解密用的是同一個密鑰,這種加密稱爲對稱加密(symmetric encryption)。函數
若是一對一的話,那麼兩人須要交換一個密鑰。理論上,若是密鑰絕對安全,並且加密算法絕對複雜的話,對稱加密是很難破解的。但通訊雙方很難絕對保證密鑰的安全。一旦有其餘人竊取到密鑰,那麼全部通訊都變得不安全了。特別在一對多的話,若是共用同一套密鑰,那麼某一方通訊的破解就意味着全部通訊的破解。二戰中盟軍的情報戰成果,不少都來自於破獲這種對稱加密的密鑰。盟軍破解了某個德國特工的加密手法,那麼也就瞭解到納粹總部的加密手法了。post
二戰中德軍的傳奇加密機: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協議分爲客戶端和服務器端。通訊的核心步驟很簡單:
1. 雙方利用明文通訊的方式確立使用的加密算法。
2. 利用非對稱算法通訊,交換一個密鑰。
3. 該密鑰用於對稱加密算法,加密接下來的通訊正文。
能夠看到,SSL協議的關鍵是用一個很是安全的方式來交換一個對稱密鑰。交換的過程會比上面的描述更加複雜一些。
1. 客戶發起請求時,除了說明本身支持的非對稱加密算法,還會附加一個客戶端隨機數(client random)。
2. 服務器回覆請求時,會肯定非對稱加密算法和哈希函數,並附上公鑰。此外,服務器端還會在這次通訊中附加一個服務器端隨機數(server random)。
3. 客戶端會產生第三個隨機數(Premaster secret),而後利用服務器肯定的非對稱加密算法和公鑰來加密這個隨機數,再發送給服務器端。
4. 客戶端用本身的私鑰解密第三個隨機數。
4. 這樣,客戶端和服務器端都知道了三個隨機數。雙方各自用商量好的哈希函數從三個隨機數得到對稱加密的密鑰。
即便明文通訊的時候,某些信息被竊聽,但第三步的非對稱加密通訊部分能夠保證竊聽者沒法完整的得到三個隨機數。這樣,竊聽者仍是不知道對稱加密的密鑰是什麼。這樣,對稱加密的密鑰就在一個安全的環境中得到了。爲了進一步安全,服務器的公鑰會包含在一個數字證書中發送給客戶。這樣,客戶還能夠經過數字證書來驗證服務器的身份,以避免服務器自己出現問題。
今年來使用愈來愈普遍的HTTPS協議就是在SSL/TLS協議的基礎上進行通訊。HTTP協議在通訊過程當中要通過多重路由,很容易被竊聽。通過SSL協議加密的信息就算被竊聽,也只能被通訊目的地的人解讀,從而保證了信息的安全。因此,若是所訪問的網站沒有使用HTTPS協議,那麼在輸入銀行帳號和密碼之類的敏感信息時,就要三思然後行了。
當瀏覽器出現鎖的符號時,說明訪問的資源使用了HTTPS通訊