SSL/TLS概述

TLS/SSL協議

TLS/SSL位於TCP層和應用層之間,具體如下圖所示

設計目的

  • 身份驗證
  • 保密性
  • 完整性

握手協議

  • 驗證通訊雙方的身份
  • 交換加解密的安全套件
  • 協商加密參數

TLS安全密碼套件解讀

SSL/TLS協議在協商時,會選擇一組恰當的加密算法來實現安全通信,這些算法的組合被稱爲“密碼套件”

密碼套件的命名如上所示,格式很固定,基本的形式是:“密鑰交換算法+簽名算法+對稱加密算法+摘要算法”
以上密碼套件的意思如下:“握手時使用ECDHE算法進行密鑰交換,用RSA簽名和身份認證,握手後的通信使用AES對稱算法,密鑰長度128位,分組模式是GCM,摘要算法SHA256用於消息認證和產生隨機數。”

對稱加密和非對稱加密

對稱加密

使用同一把密鑰對數據進行加解密

TLS 裏有非常多的對稱加密算法可供選擇,比如 RC4、DES、3DES、AES、ChaCha20 等,但前三種算法都被認爲是不安全的,通常都禁止使用,目前常用的只有 AES 和 ChaCha20。

ChaCha20 是 Google 設計的另一種加密算法,密鑰長度固定爲 256 位

AES加密算法詳解

AES:高級加密標準,密鑰長度可以是128、192 或 256。它是 DES 算法的替代者,安全強度很高,性能也很好,
常用填充算法:PKCS7
常用分組模式:GCM

AES的加密步驟:

  1. 把明文按照 128bit(16 字節)拆分成若干個明文塊,每個明文塊是 4*4 矩陣
  2. 按照選擇的填充方式來填充最後一個明文塊
  3. 每一個明文塊利用 AES 加密器和密鑰,加密成密文塊
  4. 拼接所有的密文塊,成爲最終的密文結果

對稱加密分組模式

對稱算法還有一個“分組模式”的概念,它可以讓算法用固定長度的密鑰加密任意長度的明文,把小祕密(即密鑰)轉化爲大祕密(即密文)。
最新的分組模式被稱爲 AEAD(Authenticated Encryption with Associated Data),在加密的同時增加了認證的功能,常用的是 GCM、CCM 和 Poly1305。
比如,AES128-GCM,意思是密鑰長度爲 128 位的 AES 算法,使用的分組模式是 GCM

非對稱加密

對稱加密看上去好像完美地實現了機密性,但其中有一個很大的問題:如何把密鑰安全地傳遞給對方,術語叫“密鑰交換”。
非對稱加密有兩個密鑰,一個叫“公鑰”(public key),一個叫“私鑰”(private key)。兩個密鑰是不同的,“不對稱”,公鑰可以公開給任何人使用,而私鑰必須嚴格保密。

非對稱加密算法的設計要比對稱算法難得多,在 TLS 裏只有很少的幾種,比如 DH、DSA、RSA、ECC 等。

  • RSA:它的安全性基於“整數分解”的數學難題,使用兩個超大素數的乘積作爲生成密鑰的材料,想要從公鑰推算出私鑰是非常困難的。
  • ECC:它基於“橢圓曲線離散對數”的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰,子算法 ECDHE 用於密鑰交換,ECDSA 用於數字簽名。

混合加密

非對稱加密算法因爲基於複雜的數學難題,運算速度很慢,所以需要使用混合加密。

  • 在通信剛開始的時候使用非對稱算法,比如 RSA、ECDHE,首先解決密鑰交換的問題。
  • 然後用隨機數產生對稱算法使用的“會話密鑰”(session key),再用公鑰加密。因爲會話密鑰很短,通常只有 16 字節或 32 字節,所以慢一點也無所謂。
  • 對方拿到密文後用私鑰解密,取出會話密鑰。這樣,雙方就實現了對稱密鑰的安全交換,後續就不再使用非對稱加密,全都使用對稱加密。

摘要算法

實現完整性的手段主要是摘要算法(Digest Algorithm),也就是常說的散列函數、哈希函數(Hash Function)。
摘要算法是對數據進行的唯一標識,對數據做任何一點修改都會造成摘要完全不同。
日常中常用的有MD5、SHA-1,目前TLS中推薦使用的是SHA-1的後繼者:SHA-2
SHA-2實際上是一系列摘要算法的統稱,總共有6種,常用的有SHA224、SHA256、SHA384,分別能夠生成28字節、32字節、48字節的摘要。

通常摘要也可能被黑客修改,所以需要對數據和摘要都加密傳輸,在混合加密系統裏用會話密鑰加密消息和摘要,這有個術語,叫哈希消息認證碼(HMAC)。

數字簽名

當雙方通信時無法確定對方身份,此時需要使用數字簽名進行驗證。操作步驟如下:

  1. 使用自己的私鑰加密原文的摘要,得到數字簽名
  2. 對方獲得數字簽名後,使用發佈的公鑰進行解密,如果能正常解密且數據正確,則驗明對方身份


以上過程分別叫做“簽名”和“驗籤”

數字證書和CA

上邊可以通過使用公鑰解密數據確定對方身份,但是對方如果發佈的公鑰是假的,是黑客發佈的,怎麼驗證公鑰的正確性呢,此時用到第三方的證書認證機構CA,由它來給各個公鑰簽名,用自身的信譽來保證公鑰無法僞造,是可信的。
CA對公鑰的簽名認證也是有格式的,不是簡單地把公鑰綁定在持有者身份上就完事了,還要包含序列號、用途、頒發者、有效時間等等,把這些打成一個包再簽名,完整地證明公鑰關聯的各種信息,形成“數字證書”(Certificate)。
簽發的證書分類DV、OV、EV三種,區別在於可信程度,DV是最低的,只是域名級別的可信,背後是誰不知道。EV是最高的,經過了法律和審計的嚴格覈查,可以證明網站擁有者的身份(在瀏覽器地址欄會顯示出公司的名字,例如Apple、GitHub的網站)。

不過CA怎麼證明自己呢?
有一條如下的信任鏈條,但最後由Root CA終結此鏈條,Root CA只能自己證明自己,這個就叫“自簽名證書”(Self-Signed Certificate)或者“根證書”(Root Certificate)。你必須相信,否則整個證書信任鏈就走不下去了。

有了這個證書體系,操作系統和瀏覽器都內置了各大CA的根證書,上網的時候只要服務器發過來它的證書,就可以驗證證書裏的簽名,順着證書鏈(Certificate Chain)一層層地驗證,直到找到根證書,就能夠確定證書是可信的,從而裏面的公鑰也是可信的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章