字数
1255 字
阅读时间
5 分钟
概述
首先回顾一下简化的 TLS 1.2 四次握手 过程:
- ClientHello: 客户端向服务端发送它支持的协议版本号、一个客户端随机数(
Client Random)和支持的加密套件列表。 - ServerHello & Certificate: 服务端确认加密方法,然后向客户端发送一个服务端随机数(
Server Random)和它的数字证书。 - ClientKeyExchange & ChangeCipherSpec: 客户端验证数字证书的有效性。如果有效,它会再生成一个随机数(
Pre-master Secret),并用证书中的公钥加密后发送给服务端。同时,客户端会发送一个ChangeCipherSpec消息,通知服务端后续报文将采用加密传输。 - Server ChangeCipherSpec: 服务端用自己的私钥解密得到
Pre-master Secret。然后,服务端也发送ChangeCipherSpec消息,确认后续通信将加密。
握手完成后,客户端和服务器双方都拥有了三个随机数。它们会使用这三个随机数,通过协商好的密钥派生算法,生成一个用于对称加密的会话密钥(Session Key)。后续的所有应用数据都将使用这个会话密钥进行加密和解密。
本文主要探讨这三个随机数的作用。
三个随机数
在 TLS 握手过程中,关键的三个随机数分别是:
- 客户端随机数 (Client Random): 存在于
ClientHello消息中。 - 服务端随机数 (Server Random): 存在于
ServerHello消息中。 - 预主密钥 (Pre-master Secret): 存在于
ClientKeyExchange消息中,由客户端生成,并用服务器公钥加密。

随机数的作用
1. 生成会话密钥
这三个随机数是生成会话密钥的决定性材料。任何一个随机数的不同,都会导致最终生成的会话密钥完全不同。
- 客户端和服务器使用
Pre-master Secret、Client Random和Server Random,通过一个密钥派生函数(PRF)计算出Master Secret。 - 随后,双方再从
Master Secret推导出用于加密的Session Key和用于验证数据完整性的MAC Key。
由于只有客户端和服务器知道全部三个随机数,因此只有它们能计算出正确的会话密钥,保证了通信的机密性。
2. 保证数据完整性
通信过程中,发送方会使用 MAC Key 对 HTTP 报文进行运算,生成一个消息认证码(MAC),并附加在报文后面。接收方收到后,会用相同的 MAC Key 进行校验。如果计算出的 MAC 与接收到的 MAC 一致,就证明报文在传输过程中没有被篡改。
MAC (Message Authentication Code),即报文摘要,用于验证报文的完整性和真实性。
3. 防止重放攻击
Client Random 和 Server Random 的存在保证了每次会话都是独一-的。
即使一个攻击者截获并破解了之前的会话密钥,他也无法用它来冒充客户端或服务器,因为新的会话会使用新的随机数,从而生成一个全新的会话密钥。这确保了每次建立的连接都是安全的,旧的通信数据无法被用于新的连接。
为什么需要三个随机数?
SSL/TLS 协议的设计哲学是不完全信任任何一方。它不相信任何单一的主机能够产生真正完全随机的随机数。
- 一个随机数: 如果只用
Pre-master Secret,一旦这个随机数被预测或破解(例如,客户端的随机数生成器有漏洞),整个会话密钥就会被破解。 - 两个随机数: 增加了破解难度,但如果一方的随机数生成器存在规律性,仍然有风险。
- 三个随机数: 通过组合来自客户端、服务端和客户端再次生成的三个随机源,极大地增加了最终密钥的随机性和不可预测性。即使其中一两个随机数源存在缺陷(不够随机),三个伪随机数的组合也会无限接近于真正的随机,从而确保了
Master Secret的安全性。
简单来说,每增加一个独立的随机源,破解的难度就会指数级增加,从而为整个通信过程提供了坚实的安全基础。