TLS/SSL 协议详解 (28) TLS 1.0、TLS 1.1、TLS 1.2之间的区别

来源:互联网 发布:苹果耳机手绘淘宝 编辑:程序博客网 时间:2024/05/16 12:32

TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txt

TLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txt

TLS 1.2 RFC http://www.ietf.org/rfc/rfc5246.txt


这里根据实现,进行总结。

 

区别1:对finished报文(Encrypted handshake message)影响

TLS 1.0 TLS 1.1 在计算finish时,进行的是MD5+ SHA1组合方式运算,而在TLS 1.2下,摘要算法变成了单次SHA256

 

伪代码如下

If(version >= TLS1_2)

{

     If (cipher.mac == SHA384)

     {

            restult = SHA384(handshake_in );

     }

     Else

     {

            restult  =  SHA256(handshake_in);

     }

}

Else

{

    restult  =  md5(handshake in) + sha1(handshake_in);

}

 

    其中 handshake_in是 字符串常量+所有握手信息(类型为Handshake的message)。

       例如

    作为clienthandshake_in =“client finidhed” + all_handshake

    作为Server handshake_in = “server finidhed” + all_handshake

 

    注:对于加密套件存在SHA384及其以上的高级摘要算法,无论TLS哪个版本,都用 加密套件指定的 握手摘要算法计算 摘要,如上伪代码所示(RFC上说对于每一种新的算法, 都需要指定default还是SHAXXX,但是在实现上,都是根据MAC是什么,SHAXXX就是什么)。

其实加密套件中指定的摘要算法是用来在加密时进行HMAC的,并不影响握手流程中的运算,但是如果两端协商的加密套件支持SHAXXX,那么必然表示两端支持SHAXXX算法,那么在SHAXXX安全性高于SHA256的情况下,握手阶段需要摘要算法就没必要那么‘死’只用SHA256。当然目前也没有比SHA384更高的了。


 

区别2:对PRF算法的影响

 

先用伪代码梳理逻辑:

 

If(version >= TLS1_2)

{

    If (cipher.mac == SHA384)

    {

        TLS1_2_PRF(SHA384, in, srcret);

    }

    Else

    {

        TLS1_2_PRF(SHA256, in, srcret);

    }

}

Else

{

    TLS1_PRF(MD5,SHA1, in, srcret);

}

 

1:对于SHA384的判断,上面已经说过,这里不再赘述。

2:可以看到TLS1.2TLS 1.0 TLS 1.1RFC实现也不同,至少参数不同。

 

TLS 1.2 PRF

    单次P_HASHP_HASH使用的是SHA256

TLS 1.1 PRF

    两次P_HASH,第一次P_HASH使用的是MD5,以及secret的前半部分;第二次P_HASH使用的SHA1,以及secret的后半部分。两次P_HASH的结果进行亦或(xor),得到最后结果。

    注意secret如果是偶数,则正好各一半,如果是奇数:

例如secret1234567,则前一半 指的是1234,后一半指的是4567,中间一个字节公用。




区别3:对Certificate verify的影响

Certificate vertify是客户端在发送证书后,为了表明自己是证书的拥有者,用自己的私钥对之前收到、发送的握手信息进行签名。(和finished类似)。

同样签名前,需要对握手信息进行HASH运算。

 

TLS1.0 TLS1.1:

使用MD5+SHA1的形式对握手信息进行摘要运算,这个流程和计算finished一样,只是不加字符串常量’XXX finished’。

注:有一个例外,对于ECDSA签名算法(客户端证书是ECC证书),只做单次SHA1计算。

 

TLS 1.2:

TLS 1.2 下, certificate verify报文格式和之前的不同,多出2个字节(Signature Hash Algorithm),表示hash_alg以及sign_alg。具体握手摘要根据hash_alg进行单次计算。

同样,如果加密套件存在SHA384,则使用SHA384

 

TLS 1.2Certificate verify的格式



伪代码如下:


If(version >= TLS1_2)

{

    result = SHAXXX(all_handshake);

    ADD_MD_INFO_TO_PACKET();//报文中增加两个字节表明自己签名算法

}

Else

{

    If(ECDSA_SIGN)

    {

          result = SHA1(all_handshake);

    }

    Else

    {

        result = MD5(all_handshake) + SHA1(all_handshake) 

    }

}

 



区别3:对server key exchange的影响

TLS1.2下和 certificate verify类似,报文格式较之前版本有不同。多了2个字节表示HASH算法和签名算法。




区别3:对加密的影响

    上面讲了全是TLS1.2与 它之前的TLS 1.0TLS1.1的不同,这里讲的是TLS1.1 TLS1.2TLS1.0的不同,即TLS1.1开始的变化。

 

    为了对抗beast攻击,SSL在加密数据前,需要填充一个BLOCK_SIZE长度的随机数,这个随机值也被作为数据的一部分进行加密,在解密时,同样进行解密,然后丢弃。

 

    CBC下,对于上述这个场景我们其实可以进行优化,这个BLOCK_SIZE的数据对于发送端来说可以不进行加密,然后下一个数据块的Write_IV改成这个随机数,这样CBC模式就可以完整的工作。对于解密方来说,这个BLOCK_SIZE的数据可以不解密,然后解密下一个块时的Read_IV变成这个随机数,CBC模式也能正常工作。减少了一个BLOCK_SIZE的解密、加密数据。详细优化方案见我的博客 http://blog.csdn.net/mrpre/article/details/78093370