浏览器在SSL握手期间如何生成对称密钥

20

在典型的https web场景中,我对浏览器和服务器之间SSL握手存在一些疑惑:

据我目前所知,在SSL握手过程中,客户端(在本例中为浏览器)使用公钥(从服务器接收到的证书)加密一个随机选择的对称密钥。将其发送回服务器,服务器使用私钥解密(对称密钥)。现在,该对称密钥在会话的其余时间用于在两端加密/解密消息。其中一个主要原因是使用对称密钥进行更快的加密。

问题

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

2)开发人员(和/或浏览器用户)是否对生成对称密钥的此机制具有控制权?


1
客户端不会生成会话密钥,也不会对其进行加密或传输。会话密钥是通过密钥协商协议派生出来的。您的描述基本上是不正确的。您的问题建立在错误的假设之上。 - user207421
2个回答

18

这里有一个非常好的描述HTTPS连接建立工作方式的文章。我将提供关于会话密钥是如何由客户端和服务器获取的摘要,这个过程被称为“密钥协商协议”,以下是它的工作原理:

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

    master_secret = PRF(
       pre_master_secret, 
       "master secret", 
       ClientHello.random + ServerHello.random
    )
    
    PRF是指“伪随机函数”,它在规范中也有定义,十分聪明。它通过使用MD5和SHA-1哈希函数的HMAC版本组合秘密、ASCII标签和我们提供的种子数据来进行操作。输入的一半被发送到每个哈希函数中。它很巧妙,因为即使面对MD5和SHA-1的弱点,它也非常抵御攻击。这个过程可以反复迭代并不断产生我们需要的字节数。根据此过程,我们获得一个48字节的“主密钥”。

客户端不生成会话密钥,也不加密或传输它。会话密钥是通过密钥协商协议派生的。 - user207421
@EJP,你是对的,我的回答完全不正确,我已经重写了它。请检查一下,告诉我现在是否更好。 - Andrey
@Xilang,请检查我的更新答案,我根据user207421的评论进行了更正。 - Andrey
2
@honey,它必须为每个会话生成,而不仅仅是每个服务器。 - Andrey
哦,没错,那很有道理。谢谢。 - mfaani
显示剩余2条评论

1

引用网络视频中的一段话,1小时18分7秒

那么你的计算机如何获得随机性,因为你的计算机是一个确定性设备?

它会收集来自宇宙的熵,例如鼠标移动、按键移动和硬盘的时间等,尝试将所有这些随机性汇集到一个池中,以便可以为每个连接[此会话]生成随机密钥。如果这种随机性被破坏,并且在过去30年中已经发生了很多次,那么所有这些都行不通。如果对手能够猜测出你的随机性,那么他们就可以猜出你的密钥。所以要使用好的随机性。

注意:密钥是每个会话创建的。


1
这个视频真的太好了。它回答了我关于网络安全的许多问题。一旦我开始观看,我就停不下来了。讲师回答了任何非安全专家程序员想知道的随机问题。我一定会再回去看一遍的。 - mfaani
没有回答被问的问题。 - user207421
提到的YouTube视频已经无法访问了 :( - user2306856
@user2306856 真遗憾。我搜索了一下,但没找到。 - mfaani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接