4.1 PGP——密码技术的完美组合
本章以密码软件PGP(Pretty Good Privary)为题材,思考一下将前面章节所学习的密码技术进行组合的方法。
- PGP简介:1990年左右由菲利普季默曼个人编写的密码软件。PGP可以在Windows、Mac OS X、Linux等很多平台上运行,版本包括商业版和免费版。PGP具有现代密码软件所需要的几乎全部功能:对称密码、公钥密码、数字签名、单向散列函数、证书、压缩、文本数据、大文件的拆分与拼合、钥匙串管理。
OpenGPG是对密文和数字签名进行定义的标准规格。
GNU Privacy Guard是一款基于OpenPGP标准开发的密码学软件,支持加密、数字签名、密钥管理、S/MIME、ssh等多种功能。它本身是一个命令行工具,但也经常被集成到其他应用软件中。
- 生成密钥对
- gpg --full-gen-key
- 加密和解密
- 加密:PGP将消息经过混合密码系统进行加密,然后转换成报文数据。+消息的压缩以及二进制-文本转换(转换为ASCII radix-64格式)
- 解密:解密私钥 - 解密会话密钥 - 解密和解压缩消息
- 生成和验证数字签名
- 生成数字签名:解密私钥 - 生成数字签名
- 验证数字签名:恢复发送者发送的散列值 - 对比散列值
- “生成数字签名并加密”以及“解密并验证数字签名”
- 生成数字签名并加密:生成数字签名 - 加密(加密对象是数字签名和消息拼合后的数据)
- 解密并验证数字签名:解密 - 验证数字签名
- 信任网:PGP采用的一种确认公钥合法性的方法
- 不同于证书,该方法通过建立每个人之间的信任关系
小结:本章以PGP为例讲解了多种密码技术的组合。
4.2 SSL/TLS
SSL/TLS是世界上应用最广泛的密码通信方法。首先介绍运用场景,然后再介绍使用SSL/TLS的通信步骤和攻击方法。严格来说,TLS相当于是SSL的后续版本。SSL/TLS是一种在Web服务器中广泛使用的协议。
4.2.1 SSL/TLS的工作
在一个网店支付场景中,我们有几个问题必须要解决:
- 信用卡号和地址在发送到书店的过程中不能被窃听(机密性)
- 信用卡号和地址在发送到书店的过程中不能被篡改(完整性)
- 确认通信对方的Web服务器是真正的书店(认证)
要确保机密性,可以使用对称密码。使用伪随机数生成器生成密钥。密钥配送可以使用公钥密码或Diffie-Hellman密钥交换。要识别篡改,对数据进行认证,可以使用消息认证码。要对通信对象进行认证,可以使用对公钥加上数字签名所生成的证书。
工具已经备齐,只要用一个“框架”把工具都组合起来就可以了。SSL/TLS协议其实就扮演了这样一种框架的角色。
- SSL/TLS也可以保护其他协议(不仅是HTTP)
- 密码套件
- SSL与TLS的区别
4.2.2 使用SSL/TLS进行通信
4.2.2.1 层次化的协议
基于TLS1.2。TLS协议由TLTS记录协议和TLS握手协议这两层协议叠加而成。位于底层的记录协议负责进行加密,位于上层的握手协议负责加密以外的其他各种操作。TLS握手协议又可以分成4个子协议。
- TLS记录协议:位于底层;使用了对称密码和消息认证码,但是具体的算法和共享密钥则是通过握手协议在服务器和客户端之间协商决定的。
- TLS握手协议包含4个子协议:负责保证机密性意外的操作
- 握手协议:TLS握手协议的一部分,负责在客户端和服务器之间协商决定密码算法和共享密钥;基于证书的认证操作也在这个协议中完成。
- 密码规格变更协议:TLS握手协议的一部分,负责向通信对象传达变更密码方式的信号。
- 警告协议:TLS握手协议的一部分,负责在发生错误时将错误传达给对方。
- 应用数据协议:TLS握手协议的一部分,将TLS上面承载的应用数据传达给通信对象的协议。
4.2.2.2 记录协议过程
TLS记录协议负责消息的压缩、加密以及数据的认证。
- 首先,消息被分割为多个较短的片段;然后对每个片段进行压缩,压缩算法需要协商。
- 被压缩的片段被加上消息认证码。为了防止重放攻击,计算消息认证码时还加上了片段的编号。单向散列函数的算法、消息认证码所使用的密钥都需要与通信对象协商。
- 压缩片段和消息认证码回通过对称密码加密。使用CBC模式。
- 经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报头就是最终的报文数据。其中数据类型是TLS记录协议所承载的4个字协议的其中之一。
4.2.2.3 握手过程
- 客户端➡️服务器:提供客户端可用的密码套件清单、压缩方式清单,询问使用哪一个。
- 客户端⬅️服务端:选择使用的密码套件、压缩方式。
- 客户端⬅️服务端:发送Certificate消息(证书清单)。匿名通信时不发送证书。
- 客户端⬅️服务端:发送ServerKeyExchange消息。当certificate消息不足以满足需求时,会发送,否则不会。
- 客户端⬅️服务端:发送CertificateRequest消息(服务器能理解的证书类型清单、认证机构名称清单)。当不使用客户端认证时,不会发送。
- 客户端⬅️服务端:发送ServerHelloDone消息。
- 客户端➡️服务器:发送Certificate消息(证书)。步骤5发生时会发送,否则不会。
- 客户端➡️服务器:发送ClientKeyExchange消息。若使用RSA,会发送加密的预备主密钥;若使用Diffie-Hellman密钥交换,发送Diffie-Hellman公开值。根据预备主密钥,服务端和客户端会计算出相同的主密码,然后再根据主密码生成下列比特序列:对称密码的密钥、消息认证码的密钥、对称密码的CBC模式中使用的初始化向量。
- 客户端➡️服务器:发送CertificateVerify消息。步骤5发生时会发送,否则不会。客户端计算“主密码”和“握手协议中传送的信息”的散列值,并加上自己的数字签名后发送给服务器。
- 客户端➡️服务器:发送ChangeCipherSpec消息。密码规格变更协议的消息,发送之后,TLS记录协议开始使用双方协定决定的密码通信方式。
- 客户端➡️服务端:客户端发送Finished消息。使用切换后的密码套件发送,实际加密操作由TLS记录协议负责。
- 客户端⬅️服务端:服务器发送ChangeCipherSpec消息。
- 客户端⬅️服务端:服务器发送Finished消息。
- 切换至应用数据协议。在此之后,客户端和服务器都会使用应用数据协议和TLS记录协议进行密码通信。
4.2.2.4 密码规格变更协议
即使密码通信开始之后,客户端和服务器也可以通过重新握手来再次改变密码套件。
4.2.2.5 主密码
主密码是TLS客户端和服务器之间协商出来的一个秘密的数值。这个数值非常重要,TLS密码通信的机密性和数据的认证全部依靠这个数值。主密码是一个48字节(394比特)的数值。
主密码是客户端和服务器根据以下信息计算出来的:
- 预备主密码 - RSA的情况,客户端会将加密的预备主密码发送给服务器;
- 客户端随机数 - 相当于防止攻击者事先计算出密钥的盐
- 服务器随机数 - 相当于防止攻击者事先计算出密钥的盐
当根据预备主密码计算主密码时,需要使用基于密码套件中定义的单向散列函数来实现的伪随机函数。主密码主要用于生成6种信息:对称密码密钥、消息认证码密钥、对称密码CBC模式所使用的初始化向量(客户端➡️服务器、客户端⬅️服务器)。
4.2.3 攻击
- 对各个密码技术的攻击
- OpenSSL的心脏出血漏洞
- SSL3.0的漏洞与POODLE攻击
- FREAK攻击与密码产品出口管制
- 对伪随机数生成器的攻击
- 利用证书时间差进行攻击
小结:本章总结了SSL/TLS相关知识,了解了客户端和服务器通过交换一些必要信息来实现密码通信的过程。SSL/TLS是将对称密码、公钥密码、单向散列函数、消息认证码、伪随机数生成器、数字签名等技术相结合来实现通信安全的。此外,SSL/TLS还可以通过切换密码套件来使用强度更高的密码算法。