最近发现密码学很有意思,刚好还和工作有点关系,就研究了一下,本文是其中一部分笔记和一些思考。
密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢!
本文目标:
学习鉴赏TLS协议的设计,透彻理解原理和重点细节
跟进一下密码学应用领域的历史和进展
整理现代加密通信协议设计的一般思路
本文有门槛,读者需要对现代密码学有清晰而系统的理解,本文最后的参考文献里有一些很不错的学习资料。
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. 相关开源项目
密码学和软件开发不同,软件开发是工程,是手艺,造轮子是写代码的一大乐趣。软件开发中常常有各种权衡,一般难有明确的对错,一般还用建筑来比拟软件的结构,设计的优雅被高度重视。
密码学就不一样了。[密码学是科学,不是工程] 见 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,出漏洞的可能越小(所以应该尽可能使用开源组件)
TLS的设计目标是构建一个安全传输层(Transport Layer Security ),在基于连接的传输层(如tcp)之上提供:
密码学安全
(1). 保密, message privacy (保密通过加密encryption实现,所有信息都加密传输,第三方无法窃听 )
(2). 完整性, message integrity( 通过MAC校验机制,一旦被篡改,通信双方会立刻发现 )
(3). 认证, mutual authentication (双方认证,双方都可以配备证书,防止身份被冒充 )
互操作,通用性 ( 根据公开的rfc,任何符合rfc的软件实现都可以互操作,不受限于任何专利技术)
可扩展性 ( 通过扩展机制 tls_ext可以添加功能,有大量的新功能,都是通过扩展添加的)
高效率 (通过session cache,恰当部署cache之后,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。
余下内容请见后续文章。