SSL握手期间浏览器如何生成对称密钥
-
30-09-2019 - |
题
在典型的 https Web 场景中,我对浏览器和服务器之间的 SSL 握手有一点困惑:
到目前为止我所了解的是,在 SSL 握手过程中,客户端(在本例中为浏览器)使用公钥(从服务器收到的证书)加密随机选择的对称密钥。这被发送回服务器,服务器用私钥解密它(对称密钥)。现在,在会话的其余部分使用此对称密钥来加密/解密两端的消息。这样做的主要原因之一是使用对称密钥进行更快的加密。
问题
1)浏览器如何选择并生成这个“随机”选择的对称密钥?
2)开发人员(或/和浏览器用户)是否可以控制这种生成对称密钥的机制?
解决方案
这里 很好地描述了 HTTPS 连接建立的工作原理。我将总结双方(客户端和服务器)如何获取会话密钥,这个过程称为“密钥协商协议”,这里是如何工作的:
- 客户端生成 48 字节“预主密钥”随机值。
- 客户端用随机数据填充这些字节,使输入等于 128 字节。
- 客户端用服务器的公钥对其进行加密并发送给服务器。
然后双方通过以下方式产生主密钥:
master_secret = PRF( pre_master_secret, "master secret", ClientHello.random + ServerHello.random )
PRF是“伪随机函数”,在规格中也定义并且非常聪明。它结合了秘密,ASCII标签以及我们通过使用MD5和SHA-1 Hash功能的键控障碍消息身份验证代码(HMAC)版本提供的种子数据。一半的输入被发送到每个哈希函数。这很聪明,因为即使面对MD5和SHA-1的弱点,它也非常抵抗攻击。这个过程可以自我反馈,并永远迭代以生成我们需要的尽可能多的字节。
按照此过程,我们获得了 48 字节的“主密钥”。
其他提示
从网络视频上引用这个很棒的视频, 分钟1:18:07
那么,由于计算机是确定性设备,因此您在哪里可以随机性?
好吧,它会收集诸如鼠标笔触运动,钥匙中风运动和硬盘的时机之类的熵,它试图将所有随机性从宇宙收集到拉动中,以便它可以生成随机键 一个连接[此会话. 。如果这种随机性被打破,并且在过去30年中多次发生,那么这一切都没有。如果对手可以弄清楚您的随机性可以是什么,那么他们可以猜测您的钥匙。因此,请使用良好的随机性。
注意:创建钥匙 每个会话.