在典型的 https Web 场景中,我对浏览器和服务器之间的 SSL 握手有一点困惑:

到目前为止我所了解的是,在 SSL 握手过程中,客户端(在本例中为浏览器)使用公钥(从服务器收到的证书)加密随机选择的对称密钥。这被发送回服务器,服务器用私钥解密它(对称密钥)。现在,在会话的其余部分使用此对称密钥来加密/解密两端的消息。这样做的主要原因之一是使用对称密钥进行更快的加密。

问题

1)浏览器如何选择并生成这个“随机”选择的对称密钥?

2)开发人员(或/和浏览器用户)是否可以控制这种生成对称密钥的机制?

有帮助吗?

解决方案

这里 很好地描述了 HTTPS 连接建立的工作原理。我将总结双方(客户端和服务器)如​​何获取会话密钥,这个过程称为“密钥协商协议”,这里是如何工作的:

  1. 客户端生成 48 字节“预主密钥”随机值。
  2. 客户端用随机数据填充这些字节,使输入等于 128 字节。
  3. 客户端用服务器的公钥对其进行加密并发送给服务器。
  4. 然后双方通过以下方式产生主密钥:

    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年中多次发生,那么这一切都没有。如果对手可以弄清楚您的随机性可以是什么,那么他们可以猜测您的钥匙。因此,请使用良好的随机性。

注意:创建钥匙 每个会话.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top