HTTPS
HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?
一、TSL 握手为什么需要前两个随机数?
TLS 握手过程中使用的 3 个随机数(Client Random、Server Random、Pre-Master Secret)是为了增强安全性,具体原因如下:
1. 三个随机数的来源
Client Random:客户端生成,发送在 Client Hello 消息中。
Server Random:服务器生成,发送在 Server Hello 消息中。
Pre-Master Secret:由客户端生成,通过服务器的公钥加密后发送(在 Client Key Exchange 中)。
2. 为什么需要 3 个随机数?
(1) 防止重放攻击(Replay Attack)
如果仅使用 Pre-Master Secret,攻击者可能截获旧的握手消息并重放,导致密钥被复用。
Client Random + Server Random 确保每次握手生成的密钥唯一(即使 Pre-Master Secret 相同,最终密钥也不同)。
(2) 前向保密(Forward Secrecy)
在支持 ECDHE 等密钥交换算法时,Pre-Master Secret 是临时生成的,即使长期私钥泄露,过去的通信也无法解密。
三个随机数共同参与密钥计算,确保会话独立性。
(3) 防止预测密钥
如果仅依赖 1 个随机数,攻击者可能通过暴力破解或伪随机数漏洞推测密钥。
多随机数混合(Client + Server + Pre-Master)大幅增加熵值,使密钥不可预测。
(4) 兼容不同密钥交换算法
对于 RSA 密钥交换:Pre-Master Secret 由客户端生成并加密传输。
对于 DH/ECDHE 密钥交换:Pre-Master Secret 由双方协商生成。
无论哪种方式,最终密钥均需结合三个随机数计算(通过 PRF 函数)。
3. 最终密钥如何生成?
TLS 使用 伪随机函数(PRF) 将三个随机数混合,生成以下密钥:
Master Secret = PRF(Pre-Master Secret, "master secret", Client Random + Server Random)
Master Secret 再衍生出实际加密密钥(如 AES 密钥、HMAC 密钥等)。
由于 Client/Server Random 参与计算,即使 Pre-Master Secret 相同,每次握手的密钥也不同。
4. TLS 1.3 的优化
在 TLS 1.3 中:
移除了 RSA 密钥交换(仅支持 ECDHE),Pre-Master Secret 由双方临时协商。
密钥计算仍依赖 Client Random + Server Random,但握手更高效(1-RTT)。
总结
随机数 | 作用 |
---|---|
Client Random | 标识客户端唯一性,防止重放攻击。 |
Server Random | 标识服务器唯一性,增强密钥随机性。 |
Pre-Master | 提供密钥交换的核心机密,前向保密(ECDHE)或静态加密(RSA)依赖于此。 |
二、CA 如何保障服务器公钥的安全性?避免中间人攻击
1. 证书签名的基本原理
CA(证书颁发机构)在签发证书时,会:
- 计算证书的哈希值(如使用 SHA-256)。
- 用CA的私钥对该哈希值加密,生成 数字签名。
- 将签名附加到证书中,形成完整的数字证书。
客户端验证时:
- 用CA的公钥解密签名,得到原始哈希值。
- 重新计算证书的哈希值,比对是否一致。
- 如果不一致,说明证书被篡改(如公钥、域名等信息被修改)。
因此说,虽然中间人可以获取服务器的公钥和其他信息,但是它不能对其修改,因为一旦中间人修改了这些信息,客户端在验证时,计算出的哈希值和 CA 附加的数字签名(也即 CA 计算出的哈希值)不一致。