《HTTPS權威指南》- SSL、TLS和密碼學學習筆記

iOS要開始強制推行HTTPS了,你們都開始學習HTTPS的相關知識,網上不少博文一上來就講對稱加密,非對稱加密,AES,RSA,和TLS和SSL協議。對於我這種沒怎麼深刻過網絡層的人來講全靠背!理解起來至關痛苦。尤爲是對稱加密,非對稱加密,私鑰加密,公鑰加密,證書,數字簽名,TLS和SSL是用來幹嗎的,他們之間的關係,協議握手爲啥要那麼多,繞來繞去的,真是傻傻分不清楚。算法

這篇筆記就是爲了理解上面所說的那些概念,知道上面提到的名詞究竟是啥意思,之間啥關係,以及最重要最重要的,爲何協議要那麼多步驟,這些步驟存在的意思是什麼,他爲何就能實現安全性?他又是怎樣實現安全性的?安全

目錄:

網絡層:


OSI模型層:

層號 OSI層 描述 協議示例
7 應用層 應用數據 HTTP、SMTP、IMAP
6 表示層 數據表示、轉換和加密 SSL/TLS
5 會話層 多鏈接管理 -
4 傳輸層 包或流的可靠傳輸 TCP、UDP
3 網絡層 網絡節點間的路由與數據分發 IP、IPSec
2 數據鏈路層 可靠的本地數據鏈接(LAN) 以太網
1 物理層 直接物理數據鏈接(電纜) CAT5

TLS和SSL之間的關係:


SSL協議由Netscape公司開發
1995年年末發佈SSL3
1996年5月TLS工做組成立,開始講SLL從Netscape遷移至IETF
1999年1月TLS1.0面市,爲了取悅Microsoft,協議進行了改名(從SSL更成TLS)
2006年4月,TLS1.1問世
...

對稱加密(私鑰加密)


概念:是一種 混淆算法,能讓數據在非安全信道上進行安全通訊。爲了保證通訊安全,首先要獲得 雙方都承認的加密算法和密鑰(雙方的密鑰相同)
密鑰與加密算法:
數據在非安全信道上進行安全通訊。爲了保證通訊安全,要用到 密鑰加密算法
爲什麼要密鑰?
即便攻擊者知曉了整個密碼系統 除密鑰之外的全部情報,系統仍然應當能保證安全

  • 若是加密算法要獲得普遍使用,就必須讓其餘人知道,當愈來愈多的人知道,那敵人知道的可能性就會增長。
  • 沒有密鑰的簡單算法不便於在大羣體中使用,每一個人均可以解密全部人的通訊。
  • 設計出優秀的加密算法很是困難,一種算法想要更安全,就得通過更多的曝光和審視。

若是加密算法足夠優秀,攻擊者只有一種方法,那就是嘗試全部可能的解碼密鑰,俗稱窮舉密鑰搜索(exhaustive key search),基於這一點,咱們能夠說密文的安全性徹底取決於密鑰,咱們經過密鑰長度來衡量加密強度,如128位的密鑰有34*10^37種可能的組合。網絡

密碼:socket

  • 序列密碼
    核心:生成一串稱爲密鑰序列的無窮序列
    加密過程:將密鑰序列中的1字節與明文序列中的1字節進行異或操做
    解密過程:由於異或操做可逆,將密文序列中的1字節與密鑰序列中的相同字節進行異或操做。
    關鍵點:序列密碼決不能第二次相同的密鑰
    熟知的序列密碼:RC4(簡單,但以再也不安全)
  • 分組密碼
    核心:每次加密一整塊數據,只要使用相同的密鑰,每個可能的輸入組合都有惟一的輸出。所以在輸入上製造一個小變化(例如在任意一處變換1位),從而獲得大量變體。
    加密過程:接受輸入並生成看似雜亂無章的輸出。
    問題1:只能使用它們加密長度等於加密塊大小的數據。所以須要一個方法處理任意長度的數據(填充
    問題2:對於相同的輸入,輸出是相同的,這種特性使許多攻擊成爲可能。
    實踐中的應用:使用分組密碼模式的加密方案(後面有說明)來使用分組密碼,來避免分組算法的問題,做爲其餘加密基元的基礎來使用(例如散列函數,消息驗證,僞隨機數生成器,甚至序列密碼)
    熟知的分組密碼:AES
    • 填充
      追加額外的數據到明文的結尾,在TLS中,加密塊的最後1字節包含填充長度,指示填充多少字節(不包含填充長度字節)

散列函數:
定義:任意長度的輸入轉化爲定長度的輸出,散列函數的結果成爲散列,適用於密碼學的散列函數有如下特性:函數

  • 單向性:給定一個散列,沒法找到或者構造出生成它的信息。
  • 弱抗碰撞性:給定一條消息和散列,沒法找到一條不一樣的消息具備相同的散列。
  • 強抗碰撞性:計算上沒法找到兩條散列相同的信息。

使用場合:以緊湊的方式表示比較大量數據,例如比較兩個文件。常常被稱爲指紋,信息摘要(簡單稱爲摘要)
熟知的散列函數:SHA1,SHA256學習

散列函數的強度最多隻是散列長度的一半編碼

消息驗證代碼:
在數據的散列與數據自己分開傳輸時(以防攻擊者能夠同時修改數據和散列),散列函數能夠用於驗證數據完整性。
用身份驗證擴展了散列函數的密碼學函數:加密

  • MAC:只有擁有散列密鑰,才能生成合法的MAC
    一般與加密算法一塊兒使用,若是沒有MAC,那攔截者即便沒法解碼密文,也能修改密文。
  • 密鑰的散列(keyed-hash):HMAC,將散列密鑰和消息以一種安全的方式交織在一塊兒。

分組密碼模式:
爲了加密任意長度的數據而設置的密碼學方案。是分組密碼的擴展。因此的分組密碼模式都支持機密性。不過有些將其與身份驗證鏈接在一塊兒,有些模式會將分組密碼直接轉成序列密碼。
它有多種輸出模式(如下只舉出2個):設計

  • 電碼本模式(ECB)
    核心:是最簡單的分組密碼模式,它只支持數據長度正好是塊大小的整數倍的狀況,若是數據不知足這個條件就要事先填充。加密就是將數據按塊大小切分,而後分別加密每一塊。
    劣勢:由於分組密碼是肯定的(輸入相同,輸出也相同),一、密文中出現的模式對應明文中出現的模式。二、攻擊者能夠發現信息是否重複。三、攻擊者能夠觀察密文,並提交任意明文進行加密
  • 加密塊連接模式(CBC)
    基於ECB,SSl和TLS的主要模式,整個過程開始於生成一個隨機初始向量IV,長度與加密塊相等,加密前,明文的第一塊內容與IV進行異或操做,這一步對明文作了掩飾,並保證密文不盡相同。對於下一個加密塊使用上一個塊的密文做爲IV,以此類推。

    必須經過線路傳輸到接收端,這是解密必須的。code

非對稱加密(公鑰加密)


爲何要有非對稱加密?
對稱加密沒法知足如下條件:

  • 隨着使用它的團體成員增長,團體中的成員要共享同一個密鑰,所以出現問題的概率變大了
  • 咱們能夠兩兩一個密鑰,這樣3我的就須要3個密鑰,10我的就須要45個密鑰,1000我的就須要49500個密鑰!

而非對稱加密能夠解決以上問題。
使用兩個密鑰,公鑰和私鑰,兩個密鑰之間存在必定的數學關係。
使用公鑰加密,只有對應的私鑰能解。
使用私鑰加密,任何人均可以用他們相應的公鑰解密(不提供機密性,能夠用做數字簽名)。
使用說明:你能夠普遍並安全的分享你的公鑰,那麼任何人均可以想你發送信息,只有你能夠閱讀。若是他們使用各自的私鑰簽名,你還能夠精確的知道消息出自何人之手。

注意:雖然公鑰密碼的屬性很是有趣,但它很是緩慢,不適用於數據量大的場景,所以每每部署於身份驗證和共享祕密的協商,這些祕密後續用於快速的對稱加密。

數字簽名


前面說過MAC就是一種電子簽名,它可使用事先安全交換的 散列密鑰驗證真實性,雖然這種校驗很是有用,但仍有不足,由於它仍然依賴於一個私有密鑰。
藉助於公鑰密碼,數字簽名能夠實現與現實生活中的手寫簽名相似,咱們能夠利用公鑰密碼的非對稱性設計出一種算法,使用私鑰對信息進行簽名,並使用對應的公鑰驗證它。
實際的方式依照選擇公鑰的驗證密碼而不一樣,下面以RSA爲例:
簽名過程:
一、將須要簽名的文檔用散列函數獲得散列。
二、將散列和一些元數據進行編碼,例如使用的散列算法。
三、將編碼使用私鑰加密,其結果就是簽名。
四、追加到文檔中做爲驗證的依據。
驗證過程:
一、接收方接收文檔,並用相同的散列算法算出散列。
二、使用公鑰解密,將散列解碼出來。
三、對比散列算法是否正確,散列的值是否一致。
RSA的強度取決於加密,散列以及編碼組件各自的強度。

協議


加密基元自己沒有什麼用,例如加密和散列算法。咱們只有將這些元素組合成方案和協議才能知足複雜的安全需求。

實例場景:
Alice和Bob要通訊。Mallory是個攻擊者。
咱們假設協議容許交換任意數量的消息。由於對稱加密擅長對大量數據進行加密,因此選取咱們最喜歡的AES算法來進行數據加密。使用AES,Alice和Bob能夠安全的交換消息,Malloc看不到他們通訊的內容。可是這還不夠,由於Malloc還能夠幹其它事情,例如神不知鬼不覺的修改消息。爲了解決這個問題,咱們使用只有Alice和Bob知道的散列密鑰計算每一個消息的MAC,在發送消息的同時,也發送消息的MAC。這時Mallory不再能修改消息了,然而他仍然能夠丟棄或者重發任意消息。爲了解決這個問題,咱們擴展協議,爲每條消息標記指定序號。最爲重要的是,咱們將序號做爲MAC計算數據的一部分。若是發現序號出現空缺,就能知道消息丟了。若是發現序號重複,就檢測重放攻擊。爲了獲得最佳效果,咱們使用某個特殊消息來標記會話結束。若是沒有這個消息,Mallory可以悄悄的結束(截斷)會話。若是全部措施以到位,Mallory最多隻能作到阻止Alice和Bob與其餘人通訊。咱們對此無能爲力。

到目前爲止,有一大塊缺失:Alice和Bob如何協商獲得須要的兩個密鑰(一個用於加密(AES的密鑰),一個用於檢測完整性(MAC的密鑰)),同時還要小心Mallory?咱們經過爲協議添加兩個步驟來解決這個問題:

  • 使用公鑰密碼對會話進行身份驗證。
    舉個例子,Alice生成一個隨機數,要求Bob對其簽名以證實真的是他,Bob也要求Alice作一樣的事情。
  • 使用密鑰交換方案對加密密鑰進行祕密協商。
    舉個例子,Alice能夠生成全部密鑰,使用Bob的公鑰加密,再發送給Bob,這就是RSA密鑰交換的工做方式。

最後咱們協議完工時的狀態是:

  • 以握手階段開始,包括身份驗證和密鑰交換
  • 數據交換階段,保存機密性和完整性
  • 以關閉序列結束。

站在宏觀的角度看,咱們的協議與SSL和TLS完成的工做類似。

名詞簡寫及全稱:


SSL:secure socket layer 安全套接字層
TLS:transport layer security 傳輸層安全
IP:internet protocol 網絡協議
TCP:transmission control protocol 傳輸控制協議
PKI:public key infrastructure 公鑰基礎設施
OSI:open systems interconnection 開放系統互聯模型
AES:advanced encryption standard 高級加密標準
MAC:message authentication code 消息驗證代碼
HMAC:hash-based message authentication 基於散列的消息驗證代碼
CBC:cipher block chaining 加密塊連接
RSA: en.wikipedia.org/wiki/RSA
ECB:electromic codebook 電碼本
CBC:cipher block chaining 加密塊連接
IV:initialization vector 初始向量

個人簡書主頁:www.jianshu.com/users/b92ab…

相關文章
相關標籤/搜索