TLS/SSL 协议详解 (27) SSL 随机数的作用

      SSL随机数分为client random、server random,分别由客户端和服务器生成然后通过client hello和server hello发送给对方。这里不讲其他的随机数包括client key exchange的随机数,ECC签名时的随机数等。

        

    在协议实现上,SSL随机数充当了重要的角色,在各重要阶段被使用。

 

(1)生成master key

    无论是何种密钥交换算法,RSA/ECDHE/DHE,都会经过主密钥的计算(会话复用除外),

主密钥计算过程如下

 

    第一步构造 buf1= “master secret” + client_random +  server_random

    第二步送入PRF运算。PRF的入参label为 buf1,secret为pre_master_key,出参为master key。

    

    RFC上这么描述

    master_secret = PRF(pre_master_secret, "master secret",

                          ClientHello.random + ServerHello.random)

                          [0..47];

 

(2)生成对称密钥symmetry key

    即使是会话复用流程,也会进行对称密钥计算,会话复用可以恢复之前的master key。

 

    第一步构造 buf2 = “key expansion” + server_random + client_ranom

    第二步 送入 PRF运算。PRF入参label是 buf2,secret为master_key,出参为symmetry key。

    注意第一步中先拷贝server_random再拷贝client_random,这与生成master_key的方式相反。

 

    RFC上这么描述

        key_block = PRF(SecurityParameters.master_secret,

                      "key expansion",

                      SecurityParameters.server_random +

                      SecurityParameters.client_random);

 

 

 

(3)计算server key exchange 

    对server key exhange 签名前,需要对server key exchange 报文进行摘要计算,摘要不是简单的对报文进行hash,也需要随机数参与。

    第一步 构造 buf3 = client_random + server_random + value

    第二步 HASH(buf3)

 

    

 

RFC上这么描述

struct {

       select (KeyExchangeAlgorithm) {

           case dh_anon:

               ServerDHParams params;

           case dhe_dss:

           case dhe_rsa:

               ServerDHParams params;

               digitally-signed struct {

                   opaque client_random[32];

                   opaque server_random[32];

                   ServerDHParams params;

               } signed_params;

           case rsa:

           case dh_dss:

           case dh_rsa:

               struct {} ;

              /* message is omitted for rsa, dh_dss, and dh_rsa */

           /* may be extended, e.g., for ECDH -- see [TLSECC] */

   } ServerKeyExchange;

 

    至此,SSL随机数仅且在这三处被使用。最后,抛开代码,从功能上来讲,随机数可以有效防止重放攻击。例如session resume时候,当前会话的master key是上一个会话的master key,如果直接使用这个master key进行加密,就很容易进行重放攻击,所以在生成对称秘钥时,使用当前的握手的随机数和master key进行一次prf,使得当前加解密的key和上一个会话的不一样,中间人就没办法重放一个有效的application data。

你可能感兴趣的:(TLS,SSL/TLS协议详解)