SSL和TLS-TLS 介绍

SSL和TLS-TLS 介绍

TLS协议在结构上与SSL协议相同。是一个客户端/服务器协议,运行在可靠的传输层协议之上,比如TCP。
和SSL一样,也由两层组成:

  • 底层,是TLS record protocol fragments,可选压缩、加密保护高层协议数据。相应的数据结构叫TLSPlaintext、TLSCompressed和TLSCiphertext。和SSL一样,这些数据结构都包含一个字节的type属性,两个字节的version属性,另外两个字节的length属性,和可变长(最大16384)的fragment属性。type、version和length是TLS记录头,fragment是TLS记录的载荷。
  • 高层,TLS协议包含下面四个协议:
    • TLS change cipher spec protocol (20)
    • TLS alert protocol (21)
    • TLS handshake protocol (22)
    • TLS application data protocol (23)
      每个协议由唯一的内容type值标识。TLS record支持扩展新类型,比如,Heartbeat扩展(type值是24)。内容type是写到TLS记录头的type属性的值。每个协议可以携带同一协议的很多消息。

TLS协议也采用session和连接,多个连接可以公用一个session。也同时使用四个连接状态:current写/读和pending写/读状态。这意味着所有的TLS记录在current状态处理,在执行TLS握手协议期间协商和设置pending状态的安全参数和元素。在连接级别,SSL和TLS是不同的:TLS协议区分安全参数和状态元素,而SSL协议不做这种区分只考虑状态元素。

TLS连接的安全参数

参数 描述
connection end 实体在连接中是客户端还是服务器
bulk encryption algorithm 块数据加密算法(包括key大小,key有多secret,块加密还是流加密,如果是块加密还有块大小)
MAC algorithm 消息认证算法
compression algorithm 数据压缩算法
master secret 客户端和服务器共享的48字节的secret
client random 客户端提供的32字节值
server random 服务器提供的32字节值

TLS连接的状态元素

参数 描述
compression state 压缩算法的当前状态
cipher state 加密算法的当前状态
MAC secret 连接的MAC secret,
sequence number 特定连接状态下的记录发送的64位的顺序号(初始是0)

SSL和TLS的主要不同是实际生成key材料的的方式。SSL使用ad hoc的方式生成master secret和key block(使用这些生成key材料)。
TLS 1.0使用另一种构造办法,叫TLS PRF。1.0、1.1版本的TLS PRF和1.2、1.3版本的TLS PRF也有一些不同。

TLS PRF

Overview of the TLS PRF

函数的输入是secret、seed和label(有时候叫identifying label),生成任意的长的bit sequence。为了让TLS PRF尽可能安全,TLS PRF组合两种加密hash函数MD5和SHA-1。这样,PRF的结果是安全的,只要底层的两个hash函数有一个还是安全的。TLS版本1.0和1.1组合使用MD5和SHA-1,TLS版本1.2和1.3使用的hash函数是更强大的SHA-256。
TLS PRF基于一个auxiliary数据扩展函数,叫P_hash(secret,seed)。这个函数使用一个加密hash函数,把secret和seed扩展成一个任意长的输出值。函数是这样定义的:

P_hash(secret,seed) = HMAC_hash(secret,A(1) + seed) +
        HMAC_hash(secret,A(2) + seed) +
        HMAC_hash(secret,A(3) + seed) +
        ...

其中,+表示字符串连接,A是一个递归定义的函数(i>0):

A(0) = seed
A(i) = HMAC_hash(secret,A(i-1))

The A-function of the TLS PRF

扫描二维码关注公众号,回复: 4076210 查看本文章

根据需要的输出位长度,这个扩展函数可以执行任意多次。它是TLS PRF的主要成分。
这样,我们已经解释了TLS 1.0和1.1的TLS PRF。secret被分成两半(S1和S2)。输出按位异或。

PRF(secret,label,seed) =
    P_MD5(S1,label + seed) XOR P_SHA-1(S2,label + seed)

MD5的输出是16位的,SHA-1的输出是20位的,所以,扩展函数迭代次数不一样。比如,要生成80位长的输出,P_MD5执行5次,P_SHA-1执行4次。
TLS 1.2和1.3版本的TLS PRF采用相同的扩展函数,而hash函数是SHA-256。
The internal structure of the TLS PRF (as used for TLS 1.0 and TLS 1.1)

Generation of Keying Material

使用TLS PRF生成一个TLS连接需要的key材料。首先,使用一个变长的pre master secret,它是key交换算法的输出(和TLS session状态的一部分),生成一个48字节的master secret(然后用它代表TLS连接状态)。是这样构造的:

master_secret =
        PRF(pre_master_secret,"master secret",
                client_random + server_random)

其中,pre_master_secret是secret,client_random和server_random是seed,"master secret"是label。
生成了master secret,就把它当作生成TLS连接所需的各个key的熵源。这些key取自适当大小的key block,它的构造如下:

key_block =
        PRF(master_secret,"key expansion",
                server_random + client_random)

其中,master_secret是secret,client_random和server_random是seed,"key expansion"是label。
key block以适当的大小被分成下面的值:client_write_MAC_secret、server_write_MAC_secret、client_write_key、server_write_key、client_write_IV、server_write_IV。
key block里的其他材料被丢弃。比如,使用CBC模式下的3DES和SHA-1的cipher suite,需要2 · 192 = 384位的两个3DES keys,2 · 64 = 128位的两个IVs,2 · 160 = 320位的两个MAC keys。总共832位。
不同的cipher suites,需要的key block的长度是不一样的。

猜你喜欢

转载自blog.csdn.net/weixin_43364172/article/details/83864287