在典型的https web场景中,我对浏览器和服务器之间SSL握手存在一些疑惑:
据我目前所知,在SSL握手过程中,客户端(在本例中为浏览器)使用公钥(从服务器接收到的证书)加密一个随机选择的对称密钥。将其发送回服务器,服务器使用私钥解密(对称密钥)。现在,该对称密钥在会话的其余时间用于在两端加密/解密消息。其中一个主要原因是使用对称密钥进行更快的加密。
问题
1)浏览器如何选择并生成这个“随机”选择的对称密钥?
2)开发人员(和/或浏览器用户)是否对生成对称密钥的此机制具有控制权?
在典型的https web场景中,我对浏览器和服务器之间SSL握手存在一些疑惑:
据我目前所知,在SSL握手过程中,客户端(在本例中为浏览器)使用公钥(从服务器接收到的证书)加密一个随机选择的对称密钥。将其发送回服务器,服务器使用私钥解密(对称密钥)。现在,该对称密钥在会话的其余时间用于在两端加密/解密消息。其中一个主要原因是使用对称密钥进行更快的加密。
问题
1)浏览器如何选择并生成这个“随机”选择的对称密钥?
2)开发人员(和/或浏览器用户)是否对生成对称密钥的此机制具有控制权?
这里有一个非常好的描述HTTPS连接建立工作方式的文章。我将提供关于会话密钥是如何由客户端和服务器获取的摘要,这个过程被称为“密钥协商协议”,以下是它的工作原理:
然后双方以以下方式生成主密钥:
master_secret = PRF(
pre_master_secret,
"master secret",
ClientHello.random + ServerHello.random
)
PRF是指“伪随机函数”,它在规范中也有定义,十分聪明。它通过使用MD5和SHA-1哈希函数的HMAC版本组合秘密、ASCII标签和我们提供的种子数据来进行操作。输入的一半被发送到每个哈希函数中。它很巧妙,因为即使面对MD5和SHA-1的弱点,它也非常抵御攻击。这个过程可以反复迭代并不断产生我们需要的字节数。根据此过程,我们获得一个48字节的“主密钥”。引用网络视频中的一段话,1小时18分7秒:
那么你的计算机如何获得随机性,因为你的计算机是一个确定性设备?
它会收集来自宇宙的熵,例如鼠标移动、按键移动和硬盘的时间等,尝试将所有这些随机性汇集到一个池中,以便可以为每个连接[此会话]生成随机密钥。如果这种随机性被破坏,并且在过去30年中已经发生了很多次,那么所有这些都行不通。如果对手能够猜测出你的随机性,那么他们就可以猜出你的密钥。所以要使用好的随机性。
注意:密钥是每个会话创建的。