## 11.?**客戶端-服務器結構的應用程序的安全**:
應該使用TLS
適用場景:如果你以為自己理解了前面關于公鑰加密的介紹。。。
通常,在你設計了自己的RSA協議之后的1至18個月,你肯定會發現,你犯了某個錯誤,使你的協議沒有任何安全性。 比如Salt Stack,Salt Stack的協議使用了 e=1 的RSA 公鑰。。。
聽起來,TLS有下面這些黑歷史:
* The Logjam DH negotiation attack
* The FREAK export cipher attack
* The POODLE CBC oracle attack
* The RC4 fiasco
* The CRIME compression attack
* The Lucky13 CBC padding oracle timing attack
* The BEAST CBC chained IV attack
* Heartbleed
* Renegotiation
* Triple Handshakes
* Compromised CAs
但是,你仍然應該使用TLS做傳輸協議,因為:
* 這些漏洞中的大部分,僅僅是針對瀏覽器的,因為他們依賴受害者執行攻擊者控制的JavaScript腳本,這些JavaScript腳本生成重復的明文,或特定的明文。
* 這些漏洞中的大部分,其影響都可以被減輕,只需要你在代碼和配置里面寫死 TLS v1.2, ECDHE,和 AES-GCM就行。這聽起來很棘手,但是這遠遠沒有你自己設計使用ECDHE和AES-GCM的傳輸協議棘手。
* 在一個自定義的傳輸協議的場景中,你并不需要依賴CA,你可以用一個自簽名證書,嵌入到你的客戶端里面。
* 不要自己設計加密傳輸協議,這是**極其困難而易錯的工程難題**
* 使用TLS,但是不要使用默認配置