0x00 问题
比如我们在网络上进行一笔转账,我们有几个必须要解决的问题
- 客户端发送密码到服务器的过程中不能被窃听
- 客户端发送转账金额到服务器过程中不能被篡改
- 认证通信的服务端是真正的服务端
确保数据机密性
- 我们使用对称密钥和公钥密码加密,但是公钥密码加密速度慢,所以我们使用对称密码
- 由于对称密码的密钥不能被攻击者预测,因此我们使用伪随机数生成器来生成密钥
- 若要将密码的密钥发送给通信对象,可以使用公钥密码或者DH密钥交换
确保数据完整性
- 要识别篡改,对数据进行认证,需要服务端识别客户端的消息验证码,消息验证码使用单项散列函数来实现
认证服务端
- 使用公钥加上数字签名所生成的证书
找齐工具,就要用一个框架来将这些工具组合起来,SSL/TLS协议就扮演了这样一种框架的角色,它也是世界上应用最广泛的密码通信方法
0x01 SSL/TLS概述
TLS协议是由TLS记录协议(TLS record protocol)和TLS握手协议(TLS handshake protocol)两层协议叠加而成,上层的TLS握手协议又可以分为4个子协议
TLS协议的层次结构如图
TLS记录协议
TLS记录协议位于TLS握手协议的下层,是负责使用对称密码对消息进行加密通信的部分
TLS记录协议使用了对称密码和消息认证码,但是具体的算法和共享密钥则是通过后面介绍的握手协议在服务器和客户端之间协商决定的
TLS记录协议负责消息的压缩、加密以及数据的认证
注意上面的加密使用对称加密,加密使用CBC模式,CBC模式的初始化向量(IV)通过主密码(master secret,之后说明)生成,而对称密码的算法以及共享密钥需要与通信对象协商决定
报文头部的类型就是TLS记录协议承载的4个子协议之一
TLS握手协议
TLS握手协议分为4个子协议:握手协议、密码规格变更协议、警告协议和应用数据协议
握手协议
握手协议负责在客户端和服务器之间协商决定密码算法和共享密钥
注意第八步中的预备主密钥,是由客户端生成的随机数,之后会被用作生成主密码的种子(之后介绍),根据预备主密码,服务器和客户端会计算出相同主密钥
注意10-13步是密码规格变更协议的内容
从结果看,握手协议完成了一下操作
- 客户端获得了服务器的合法公钥,完成了服务器认证
- 服务器获得了客户端的合法公钥,完成了客户端认证(当需要客户端认证时)
- 客户端和服务器生成了密码通信中使用的共享密钥
- 客户端和服务器生成了消息验证码中使用的共享密钥
密码规格变更协议
在服务器和客户端之间通过握手协议协商一致之后,就会发出信息来切换密码,负责发出信号的就是密码规格变更协议
也是上面图中的10-13步
为什么这个协议不叫密码规格开始协议,要叫做密码规格变更协议呢,因为即使在密码通信开始之后,客户端和服务器也可以通过重新握手来再次改变密码套件,也就是说,在最开始的时候,客户端和服务器是使用”不加密”这一密码套件进行通信的,因此通信内容没有进行加密
警告协议
当协议中途发生错误时,就会通过警告协议传达给对方
应用数据协议
如果没有发生错误,则会使用应用数据协议来通信
应用数据协议是将TLS上面承载的应用数据传达给通信对象的协议
主密钥
主密钥是TLS客户端和服务器之间协商出来的一个秘密的数值,这个数值非常重要,TLS米啊吗通信的机密性和数据的认证全部依靠这个数值
主密钥是一个48字节(384比特)的数值
主密码的计算是由三个信息计算出来的
- 预备主密码
- 客户端随机数
- 服务器随机数
客户端随机数和服务器随机数的作用相当于防止攻击者事先计算出密钥的盐,预备主密钥在ClientKeyExchange时发送给服务器
当根据预备主密码计算主密码时,需要使用基于密码套件中定义的单向散列函数来实现伪随机数
主密码的目的是生成6种信息
- 对称密码的密钥(客户端->服务器)
- 对称密码的密钥(客户端<-服务器)
- 消息认证码的密钥(客户端->服务器)
- 消息认证码的密钥(客户端<-服务器)
- 对称密码的CBC模式所使用的初始化向量(客户端->服务器)
- 对称密码的CBC模式所使用的初始化向量(客户端<-服务器)
TLS中使用的密码技术小结
TLS握手协议中使用的密码技术
TLS记录协议中使用的密码技术