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
函数的输入是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))
根据需要的输出位长度,这个扩展函数可以执行任意多次。它是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。
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的长度是不一样的。