TLS協議分析 (一) 設計目標及歷史

來源:http://chuansong.me/n/1256214352643

2016-12-07何龍微信後臺團隊

最近發現密碼學很有意思,剛好還和工作有點關係,就研究了一下,本文是其中一部分筆記和一些思考。

密碼學理論艱深,概念繁多,本人知識水平有限,錯誤難免,如果您發現錯誤,請務必指出,非常感謝!

本文目標:

  1. 學習鑑賞TLS協議的設計,透徹理解原理和重點細節

  2. 跟進一下密碼學應用領域的歷史和進展

  3. 整理現代加密通信協議設計的一般思路

本文有門檻,讀者需要對現代密碼學有清晰而系統的理解,本文最後的參考文獻裏有一些很不錯的學習資料。

目錄 :

TLS協議分析 與 現代加密通信協議設計
一 . TLS協議的設計目標:
1. 密碼學的方法論
2. TLS的設計目標
3. TLS的歷史
二. TLS協議的原理
1. 自頂向下,分層抽象
2. TLS CipherSuite
3. 協議分層
4. record 協議
4.1. SecurityParameters
4.2. record層分段
4.3. record層的密碼學保護
4.4. record層的密碼學保護--MAC
4.5. record層的密碼學保護--stream cipher
4.6. record層的密碼學保護-- CBC block cipher
4.7. record層的密碼學保護-- AEAD cipher
4.8. record層的密碼學保護-- Key擴展
5. handshake 協議
5.1.handshake的總體流程
5.2. handshake 協議外層結構
5.3. handshake -- ClientHello,ServerHello,HelloRequest
5.4. handshake -- Server Certificate
5.5. handshake -- Server Key Exchange
5.6. handshake -- Certificate Request
5.7. handshake -- Server Hello Done
5.8. handshake -- Client Certificate
5.9. handshake -- Client Key Exchange
5.9.1. RSA 加密的 Premaster Secret 消息
5.9.2. 客戶端 Diffie-Hellman 公鑰
5.9.3 客戶端 EC Diffie-Hellman 公鑰
5.10. handshake -- Cerificate Verify
5.11. handshake -- Finished
5.12. handshake -- NewSessionTicket
6. ChangeCipherSpec 協議
7. Alert 協議
8. application data協議
9. TLS協議的安全分析
9.1. 認證和密鑰交換 的安全性
9.2. 版本回退攻擊
9.3. 針對握手過程的攻擊
9.4. 針對 Resuming Sessions 的攻擊
9.5. 針對應用數據保護的攻擊
9.6. 顯式 IV的安全性
9.7. 加密和MAC組合模式的安全性
9.8. DOS 攻擊下的安全性
9.9.Session Ticket 的安全分析
10. TLS擴展:
11. TLS的配套:PKI體系
11.1. X.509 證書
11.2.現有PKI體系暴露出的問題
11. TLS協議歷史上出現過的漏洞,密碼學常見陷阱
11.1. TLS的漏洞
12.1. TLS的漏洞
12.2. 密碼學常見陷阱
13. 下一代TLS: TLS 1.3
三. TLS協議的代碼實現
四. TLS協議的部署與優化
五. 更多的加密通信協議case:QUIC,iMessage,TextSecure, otr, ios HomeKit,libsodium
1. QUIC
2. apple ios iMessage
3. apple ios HomeKit
4. TextSecure
5. otr 協議
6. libsodium/NaCL 等
六. TLS協議給我們的啓發 -- 現代加密通信協議設計
七. 附錄:密碼學基礎概念
八. 參考文獻:
1. TLS/SSL 相關RFC及標準
2. 協議分析文章
3. 實際部署調優相關
4. 密碼學相關
5. 相關開源項目

一 . TLS協議的設計目標:

1. 密碼學的方法論

密碼學和軟件開發不同,軟件開發是工程,是手藝,造輪子是寫代碼的一大樂趣。軟件開發中常常有各種權衡,一般難有明確的對錯,一般還用建築來比擬軟件的結構,設計的優雅被高度重視。

密碼學就不一樣了。[密碼學是科學,不是工程]  見 http://www.daemonology.net/blog/2013-06-17-crypto-science-not-engineering.html ,有嚴格的技術規範,嚴禁沒有經過學術訓練者隨意創造。要求嚴謹的理論建模,嚴密的數學證明。很少有需要權衡的地方,正確就是正確,錯誤就是錯誤。又由於密碼學過去在軍事上的重要價值,各國政府一直投入大量人力物力財力,不斷深入強化己方的算法,破解對手的算法,所以密碼學就是一種殘酷的軍備競賽。

  • 密碼學有很多的陷阱(下文會介紹幾個),設計使用密碼學的協議或者軟件,是極其容易出錯,高風險的專業活動,單純的碼農背景是做不了的。本着不作死就不會死的偉大理念,首先推薦讀者儘可能使用 TLS 這種標準化,開源,廣泛使用,久經考驗,高性能的協議。本文也只是整理一點粗淺的科普常識,讀完這篇文章,並不能使讀者具有設計足夠安全的密碼學協議的能力。

  • 密碼學經過幾十年的軍備競賽式發展,已經發展出大量巧妙而狡猾的攻擊方法,我們使用的算法,都是在所有已知的攻擊方法下都無法攻破的,由於我們大多數碼農並沒有精力去了解最前沿的攻擊方法,所以我們其實並沒有能力去評價一個加密算法,更沒有能力自己發明算法。所以最好跟着業界的主流技術走,肯定不會有大錯。

  • 現代密碼學近20年進展迅猛,現在搞現代密碼學研究的主要都是數學家,在這個領域裏面以一個碼農的知識背景,已經很難理解最前沿的東西,連正確使用加密算法都是要謹慎謹慎再謹慎的。一個碼農,能瞭解密碼學基本概念,跟進密碼學的最新應用趨勢,並正確配置部署TLS這種協議,就很不錯了。

  • 密碼學算法很難被正確地使用,各種細節非常容易出錯。
    例如:

    • 1.大多數碼農都聽說過aes,可是大多數都不瞭解細節,比如:aes應該用哪種模式?應該用哪種padding?IV/nonce應該取多少bit?IV/nonce應該怎麼生成? key size應該選多大?key應該怎麼生成?應不應該加MAC?MAC算法的選擇?MAC和加密應該怎麼組合?

    • 2.大多數知道RSA的碼農分不清 RSASSA-PKCS1-v1_5 ,RSAES-OAEP 和 RSASSA-PSS

    • 3.更多錯誤參見 [這個stackoverflow問答,強烈推薦仔細閱讀] 見 http://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology

  • 密碼學算法很難被正確地實現(代碼實現過程中會引入很多漏洞,比如HeartBleed,比如各種隨機數生成器的bug,時間側通道攻擊漏洞)

    • 不能一知半解,絕對不能在一知半解的情況下就動手設計密碼學協議。猶如“盲人騎瞎馬,夜班臨深池”。

    • 不能閉門造車,密碼學相關協議和代碼一定要開源,採用大集市式的開發,接受peer review,被越多的人review,出漏洞的可能越小(所以應該儘可能使用開源組件)

2. TLS的設計目標

TLS的設計目標是構建一個安全傳輸層(Transport Layer Security ),在基於連接的傳輸層(如tcp)之上提供:

  1. 密碼學安全
    (1). 保密, message privacy (保密通過加密encryption實現,所有信息都加密傳輸,第三方無法竊聽 )
    (2). 完整性, message integrity(  通過MAC校驗機制,一旦被篡改,通信雙方會立刻發現 )
    (3). 認證, mutual authentication (雙方認證,雙方都可以配備證書,防止身份被冒充 )

  2. 互操作,通用性 ( 根據公開的rfc,任何符合rfc的軟件實現都可以互操作,不受限於任何專利技術)

  3. 可擴展性 ( 通過擴展機制 tls_ext可以添加功能,有大量的新功能,都是通過擴展添加的)

  4. 高效率 (通過session cache,恰當部署cache之後,tls的效率很高)

請認準這幾個目標,在後文中,會逐一實現。

3. TLS的歷史

  • 1995: SSL 2.0, 由Netscape提出,這個版本由於設計缺陷,並不安全,很快被發現有嚴重漏洞,已經廢棄。

  • 1996: SSL 3.0. 寫成RFC,開始流行。目前(2015年)已經不安全,必須禁用。

  • 1999: TLS 1.0. 互聯網標準化組織ISOC接替NetScape公司,發佈了SSL的升級版TLS 1.0版.

  • 2006: TLS 1.1. 作爲 RFC 4346 發佈。主要fix了CBC模式相關的如BEAST攻擊等漏洞

  • 2008: TLS 1.2. 作爲RFC 5246 發佈 。增進安全性。目前(2015年)應該主要部署的版本,請確保你使用的是這個版本

  • 2015之後: TLS 1.3,還在制訂中,支持0-rtt,大幅增進安全性,砍掉了aead之外的加密方式

由於SSL的2個版本都已經退出歷史舞臺了,所以本文後面只用TLS這個名字。
讀者應該明白,一般所說的SSL就是TLS。

餘下內容請見後續文章。

發佈了2 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章