文章目錄
- TLS/SSL協定
-
- 設計目的
- 握手協定
- TLS安全密碼套件解讀
- 對稱加密和非對稱加密
-
- 對稱加密
-
- AES加密算法詳解
- 對稱加密分組模式
- 非對稱加密
- 混合加密
- 摘要算法
- 數字簽名
- 數字證書和CA
TLS/SSL協定
TLS/SSL位于TCP層和應用層之間,具體如下圖所示
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49jbC5WY1d3VkFHbXJ2dVRkY41kahVnWuFmew5mY2YFVP5mRUV2capGV0hGVlJTQE1kdVJjW5Z0RiZHNykVdjdlYwZUbiBnTuxEeF1GZwkTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
設計目的
- 身份驗證
- 保密性
- 完整性
握手協定
- 驗證通訊雙方的身份
- 交換加解密的安全套件
- 協商加密參數
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的加密步驟:
- 把明文按照 128bit(16 位元組)拆分成若幹個明文塊,每個明文塊是 4*4 矩陣
- 按照選擇的填充方式來填充最後一個明文塊
- 每一個明文塊利用 AES 加密器和密鑰,加密成密文塊
- 拼接所有的密文塊,成為最終的密文結果
對稱加密分組模式
對稱算法還有一個“分組模式”的概念,它可以讓算法用固定長度的密鑰加密任意長度的明文,把小秘密(即密鑰)轉化為大秘密(即密文)。
最新的分組模式被稱為 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)。
數字簽名
當雙方通信時無法确定對方身份,此時需要使用數字簽名進行驗證。操作步驟如下:
- 使用自己的私鑰加密原文的摘要,得到數字簽名
- 對方獲得數字簽名後,使用釋出的公鑰進行解密,如果能正常解密且資料正确,則驗明對方身份
以上過程分别叫做“簽名”和“驗簽”
數字證書和CA
上邊可以通過使用公鑰解密資料确定對方身份,但是對方如果釋出的公鑰是假的,是黑客釋出的,怎麼驗證公鑰的正确性呢,此時用到第三方的證書認證機構CA,由它來給各個公鑰簽名,用自身的信譽來保證公鑰無法僞造,是可信的。
CA對公鑰的簽名認證也是有格式的,不是簡單地把公鑰綁定在持有者身份上就完事了,還要包含序列号、用途、頒發者、有效時間等等,把這些打成一個包再簽名,完整地證明公鑰關聯的各種資訊,形成“數字證書”(Certificate)。
簽發的證書分類DV、OV、EV三種,差別在于可信程度,DV是最低的,隻是域名級别的可信,背後是誰不知道。EV是最高的,經過了法律和審計的嚴格核查,可以證明網站擁有者的身份(在浏覽器位址欄會顯示出公司的名字,例如Apple、GitHub的網站)。
不過CA怎麼證明自己呢?
有一條如下的信任鍊條,但最後由Root CA終結此鍊條,Root CA隻能自己證明自己,這個就叫“自簽名證書”(Self-Signed Certificate)或者“根證書”(Root Certificate)。你必須相信,否則整個證書信任鍊就走不下去了。
有了這個證書體系,作業系統和浏覽器都内置了各大CA的根證書,上網的時候隻要伺服器發過來它的證書,就可以驗證證書裡的簽名,順着證書鍊(Certificate Chain)一層層地驗證,直到找到根證書,就能夠确定證書是可信的,進而裡面的公鑰也是可信的。