TLS/SSL
協議是爲了解決網絡通信中的信息安全問題而誕生的。git
它的設計目的主要有三個:github
TLS/SSL
協議主要包含兩部分:
一、Record
記錄協議算法
二、Handshake
握手協議瀏覽器
對稱加密算法是指在加密和解密過程當中使用相同的密鑰。安全
舉例:
張三在與李四通信時爲了防止第三方竊聽,使用莫斯密碼將通信內容加密。李四接收到通信內容後,使用相同的莫斯密碼將內容解密。網絡
由於使用了相同的莫斯密碼,因此這屬於對稱加密。dom
網絡通信中的對稱加密之因此可以使用相同的密鑰對內容進行加/解密,是由於使用了異或運算。函數
在數學領域中異或運算:當兩兩數值相同爲否,而數值不一樣時爲真。網站
在計算機領域中的異或運算: 加密
舉例:
現有一把密鑰:1010,與明文:0110。
一、使用密鑰對明文進行加密,得出密文爲:1100
XOR
0 = 1XOR
1 = 1XOR
1 = 0XOR
0 = 0二、使用相同的密鑰對密文進行解密,得出明文:0110
XOR
1 = 0XOR
1 = 1XOR
0 = 1XOR
0 = 0可見XOR
異或運算是對稱加密的關鍵!
優勢:
缺點:
異或運算要求雙方長度一致的這個缺點要怎麼解決呢?聰明的同窗或許已經想到解決方法了:就是將明文劃分爲多個等長的塊。
好比密鑰爲16字節的,那就將明文劃分爲多個16字節的塊,分別用密鑰對這些明文塊進行加解密。
Block cipher
分組加密原理就是這樣:將明文劃分爲多個等長的Block
塊,對每個Block
塊分別加解密。
但並非全部的明文都能剛好的劃分爲16字節的塊。這時就須要填充!
填充的目的:
Block
塊的長度不足時,就須要填充。填充主要有兩種方法:
其中字節填充有4種填充方式:
Block塊
只有12個字節,那麼就填入00 00 00 00。ANSI X9.23
--也是補零,只是在最後一個字節填寫說明須要填充多少個字節。Block
塊只有12個字節,那麼就填入00 00 00 04。ISO 10126
--填隨機數,在最後一個字節填寫說明須要填充多少個字節。Block
塊只有12個字節,那麼就填入45 A3 D2 04。PKCS7
--須要填充多少個字節,就填寫多少。Block
塊只有12個字節,那麼就填入04 04 04 04。對明文進行分組、填充後,還要按照必定的規律或方法進行加/解密。這些規律或者方法就是工做模式。
分組工做模式:block cipher mode of operation
一、 電子密碼本ECB
模式--Electronic codebook
就是直接將明文分解爲多個塊,對每一個塊進行加密。
這種工做方法很是簡單、快速。可是缺點在於一樣的明文塊會被加密成相同的密文塊;所以,它不能很好的隱藏數據模式。
舉例:
對圖片進行ECB
以後,是沒法隱藏到圖像的輪廓特性的。以下圖所示:
二、密碼分組連接CBC
模式--Cipher-block chaining
每一個明文塊先與前一個密文塊進行異或後,再進行加密。在這種方法中,每一個密文塊都依賴於它前面的全部明文塊。同時,爲了保證每條消息的惟一性,在第一個塊中須要使用初始化向量。
它的主要缺點在於加密過程是串行的,沒法被並行化。
三、計數器模式CTR
模式--Counter
CTR
將塊密碼變爲流密碼。它經過遞增一個加密計數器以產生連續的密鑰流,其中,計數器能夠是任意保證長時間不產生重複輸出的函數。
這樣加密和解密過程都可以進行並行處理並且加密效果也很是理想。
CTR
模式一樣存在問題:沒法提供密文的完整性校驗。當密文在傳輸過程當中存在丟失的狀況下,是沒法保證密文的完整性的。
MAC
算法--Message Authentication Code
。
MAC
算法可以實現消息的完整性校驗。工做原理是基於hash函數的。
hash
函數是一種從任何一種數據中建立小的數字「指紋」的方法。hash
函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。
簡而言之就是:不管輸入多長的字符串,經過hash
函數,都能獲得定長較短的字符串。
MAC
工做流程如圖所示:
MAC
算法生成一個MAC
序列。而後將密文與MAC
序列值一塊兒打包發送。MAC
算法也生成一個MAC
序列。而後比對這兩個MAC
序列是否相同。CTR
分組工做模式加上MAC
算法就誕生了GCM
分組工做模式。
高級加密標準AES
算法--Advanced Encryption Standard
PKCS7
GCM
AES
的分組Block
塊長度固定爲128比特,也就是16字節。
密鑰長度則能夠是128,192或256比特。
AES加密過程是在一個4×4的字節矩陣上運做。
因此從上圖中看出,分組長度128比特分爲4個32比特。而不一樣長度的密鑰則分爲四、六、8組32位比特的矩陣。
AES
加密流程:如圖所示
AddRoundKey
輪密鑰加二、普通輪
AddRoundKey
輪密鑰加SubBytes
字節替代ShiftRows
行移位MixColumns
列混合三、最終輪
SubBytes
字節替代ShiftRows
行移位AddRoundKey
輪密鑰加addRoundKey
輪密鑰加
round key
)作XOR
運算;每一個子密鑰由密鑰生成方案產生。SubBytes
字節替代
ShiftRows
行移位
MixColumns
列混合
MixColumns
步驟,而以另外一個AddRoundKey
取代。 對稱加密的最大的問題是怎麼把密鑰傳遞給對方。非對稱密碼能夠實現密鑰的安全傳遞。
每個參與方都有一對密鑰:
非對稱加解密過程:
舉例:
張三要和李四通信
第一步:張三用李四的公鑰進行加密,將密文發送給李四。
第二步:李四用本身的私鑰進行解密。
密文是沒法經過公鑰解密的,只有私鑰才能解密。
張三怎麼拿到李四的公鑰?有兩種辦法:
RSA
是基於公開密鑰密碼體制的。
公開密鑰密碼體制是一種「由已知加密密鑰推導出解密密鑰在計算上是不可行的」密碼體制。
RSA
算法中公私鑰的產生:
p
和q
。p
和q
的乘積n
(明文小於n
)。n
的歐拉函數v
, v=(p-1)*(q-1)
。e
,且1<e<v
,k
與v
是互質。e
對於v
的膜反元素d
,(d * e)%v = (e * d)%v = 1
。(e, n)
。(d, n)
。RSA
的安全性依賴於大數因數分解很是很是困難,也就是經過一個大數n
是很是難的分解出p
和q
。
RSA
算法的加解密流程:以下圖所示
因爲進行大量的大數乘法運算,RSA的速度是對應一樣安全級別的對稱密碼算法的1/1000左右。
PKI
是非對稱密碼學的一個很是重要的應用。
基於私鑰加密,只能使用公鑰解密的原理實現身份驗證的做用。
簽名與驗籤的流程
RSA
算法生成一對公私鑰,而後將公鑰與站長的我的身份發送給Certificate Authority
數字證書認證機構CA
機構覈實完我的信息後就對這些信息使用CA
機構的私鑰進行加密生成一個公鑰數字證書CA
信息、公鑰用戶信息、公鑰、權威機構的簽名和有效期。具體的流程:如圖所示
簽名:
hash
函數生成一個hash
值。CA
機構的私鑰對hash
值進行加密。驗籤:
hash
值。hash
函數生成一個hash
值。CA
機構的公鑰解密證書中的加密的hash
值。hash
值是否相等。證書類型:
domain validated
:DV
證書DV
證書一般是免費的organization validated
:OV
證書OV
證書驗證更爲嚴格,一般是收費的extended validate
:EV
證書EV
證書最爲嚴格,因此也是最貴的。從加密安全性上看,三類證書的保密性都是同樣的,只有在站長的我的信息驗證上有所不一樣。
上面說到張三有兩種辦法能夠拿到李四的公鑰:
PKI
公鑰基礎設施拿到的。RSA
算法通常是第一種方法中用於CA
機構的身份驗證上的。事實上RSA
算法用於第二種方法也是可行的。
舉例:
張三與李四創建連接。李四用RSA算法生成一對公私鑰,在握手中李四將公鑰傳遞給張三。而後張三將對稱加密的密鑰用公鑰進行加密後傳遞給李四,李四用私鑰解密獲得密鑰。
就算第三方拿到公鑰,沒有私鑰是沒法解密密文的。
但這種方式有一個缺點:沒有前向保密性。
也就是說當第三方將通信的報文所有保存下來後,在破解出私鑰以後,就能知道全部密文內容。
而DH
密鑰交換協議就解決了這個問題。它能夠雙方在徹底沒有對方任何預先信息的條件下經過不安全信道建立起一個密鑰。因此每一次通信中密鑰都是實時生成的
具體流程:
DH
協議將對方的公鑰和本身的私鑰生成一個密鑰。這兩個密鑰是徹底相同的。DH密鑰交互協議的原理:
g
和p
,而後指定本身私鑰a
,根據g
、p
和私鑰a
生成公鑰A
。g
和p
與本身公鑰A
發送給張三。b
,而後基於公開數g
、p
和私鑰b
生成公鑰B
。B
發送給李四。K
。如圖所示
DH
交換協議的問題:容易遭到中間人僞造攻擊。
簡單來講:第三方僞裝本身是張三向李四進行一次DH
密鑰交換,而後又僞裝李四向張三進行一個DH
密鑰交換。就能夠知道密鑰K
。
解決這個方法很簡單,就是使用PKI
公鑰基礎體系中的身份驗證。第三方就沒法僞裝李四這個站長了。
從圖中看出DH
協議也涉及到大量的大數乘法運算,速度也是很是慢的。而目前使用的DH
密鑰交換協議是基於ECC
橢圓曲線加持過的,速度很是的快。稱爲ECDHE
密鑰交換算法。具體細節能夠本身去搜索查詢。
TLS1.2
中常用的一個安全套件是:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
具體說明一下:
參考文獻:
分組密碼工做模式--wiki
高級加密標準--wiki
RSA算法--wiki
DH密鑰交換協議--wiki
《計算機網絡:自頂向下方法》
Web協議詳解與抓包實戰--陶輝
更多文章請移步樓主github,若是喜歡請點一下star,對做者也是一種鼓勵。