为什么客户端和服务器不直接使用公钥加密或DH密钥交换协议交换加密密钥?这背后的理由是什么或解决的问题是什么?
答案 0 :(得分:10)
有助于理解在现代SSL / TLS中如何派生密钥。早期SSL(如SSLv2)的情况有所不同。
master_secret
是客户端和服务器共享的常见秘密。它用于派生会话特定的密钥。 master_secret
派生形式的其他参数(如下所述)。
每个秘密有6个来自master_secret
:
假设既不使用 eNULL
也不使用aNULL
,则客户端和服务器都使用加密密钥进行机密性,使用HMAC密钥进行真实性处理。每个(客户端和服务器)都有自己的密钥。
虽然IV通常被认为是公共的,但SSL / TLS将它们视为秘密参数。
从RFC 5246开始,master_secret
派生为:
master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)
[0..47];
pre_master_secret
来自密钥协议或密钥传输。如果它来自密钥协议,则pre_master_secret
是Diffie-Hellman密钥协议的结果。在协议方案中,双方都对派生的秘密作出贡献。
如果pre_master_secret
来自密钥传输方案,则客户端会加密服务器公钥下的随机值。在此方案中,只有客户端提供密钥材料。当只有一方提供密钥时,它被称为密钥传输方案。
背后的理由是什么或解决的问题是什么?
使用pre_master_secret
的第一阶段提供了一个可插拔的"关键协议或密钥传输的架构。
派生master_secret
的第二阶段确保客户端和服务器都为密钥材料做出贡献。
此外,还有一个标签 - "主要秘密" - 这有助于确保派生是唯一的,即使相同的参数用于其他内容(假设不同的派生使用不同的标签)。 SP800-56和SP800-57(以及其他地方)讨论了标签的使用。
第二阶段中使用的散列(其中master_secret
是派生的)执行两个函数。首先,它执行混合功能。其次,它将密钥交换或密钥协议使用的组中的元素映射为随机位模式。
最后阶段是master_secret
的6个密钥的推导。根据6.3。密钥计算,派生不提供密钥独立性。它只是确保了互操作性:
To generate the key material, compute
key_block = PRF(SecurityParameters.master_secret,
"key expansion",
SecurityParameters.server_random +
SecurityParameters.client_random);
until enough output has been generated. Then, the key_block is
partitioned as follows:
client_write_MAC_key[SecurityParameters.mac_key_length]
server_write_MAC_key[SecurityParameters.mac_key_length]
client_write_key[SecurityParameters.enc_key_length]
server_write_key[SecurityParameters.enc_key_length]
client_write_IV[SecurityParameters.fixed_iv_length]
server_write_IV[SecurityParameters.fixed_iv_length]
上述步骤是一个坚实的设计。但是,当在SSL / TLS中使用时,会有很多恶魔在运行。例如,当添加重新协商等功能时,上面的不足(三次握手攻击ftw!)。
答案 1 :(得分:0)
我认为原因是如果客户端只是选择一个随机数作为对称密钥并使用服务器的公钥对其进行加密以发送到服务器,那么如果普通客户端可能存在漏洞使用了一个不完美的随机数生成器,导致可预测的对称密钥,并使通信更容易破解。
实际密钥交换协议确保对称密钥包含来自客户端和服务器的随机元素。这意味着即使客户端具有不完美的随机数生成器,如果服务器的随机数生成器在加密方面很强,则通信仍然受到保护。即使客户端和服务器的随机数生成器都有缺点,对两者组合的攻击可能比仅使用客户端的随机数生成器更昂贵。
答案 2 :(得分:0)
理由是,如果永远不会交换密钥,则永远无法检测到。众所周知,关键的谈判算法是安全的。加密仅与其密钥一样安全。
答案 3 :(得分:0)
主密钥的主密钥: 一边随机不是真正随机的,但是2边3次随机数可能是随机的..
6键对主密钥: 2用于加密,2用于消息集成检查,2用于防止CBC攻击