## 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,但是不要使用默认配置