为什么客户端和服务器不直接使用公钥加密或DH密钥交换协议交换加密密钥?这背后的理由是什么或解决的问题是什么?
jww*_*jww 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];
Run Code Online (Sandbox Code Playgroud)
在pre_master_secret来自密钥协商或密钥传输.如果它来自密钥协议,则pre_master_secret是Diffie-Hellman密钥协议的结果.在协议方案中,双方都对派生的秘密作出贡献.
如果pre_master_secret来自密钥传输方案,则客户端在服务器的公钥下加密随机值.在此方案中,只有客户端提供密钥材料.当只有一方提供密钥时,它被称为密钥传输方案.
这背后的理由是什么或解决的问题是什么?
第一阶段,pre_master_secret使用它,为密钥协议或密钥传输提供"可插拔"架构.
master_secret派生的第二阶段确保客户端和服务器都对密钥材料做出贡献.
此外,还有一个标签 - "主密钥" - 有助于确保派生是唯一的,即使相同的参数用于其他内容(假设不同的派生使用不同的标签).SP800-56和SP800-57(以及其他地方)讨论了标签的使用.
在master_secret派生的第二阶段中使用的散列执行两个功能.首先,它执行混合功能.其次,它将密钥交换或密钥协议使用的组中的元素映射到随机位模式.
最后阶段是从中推导出6个键master_secret.根据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]
Run Code Online (Sandbox Code Playgroud)
上面的步骤是一个坚实的设计.但是,当在SSL/TLS中使用时,会有很多恶魔在运行.例如,上面是不足够的时候像重新协商功能被添加(三重握手攻击FTW!).