SSL记录协议用来封装高层协议数据,它把数据分成可管理的片段,叫做fragments,然后单独处理。
每个fragment根据SSL session的压缩算法和加密模式做压缩和加密保护处理。
SSL记录处理过程可分为好几步。前四步是fragmentation、compression、message authentication和encryption。添加SSL记录头是第五步。fragmentation后返回的数据结构叫SSLPlaintext,compression后的叫SSLCompressed,加密保护后的(认证和加密)叫SSLCiphertext,它实际包含在SSL记录的fragment属性内。除了fragment,每个数据结构包含一个8-bit长的type属性,16-bit长的version属性,还有另一个16-bit长的length属性。
SSL 3.0默认不压缩。如果数据需要压缩和加密,就先压缩,再加密。既压缩又加密是危险的。TLS 1.3不支持压缩。
一个cipher spec是指加密数据的一对算法(一个数据加密算法和一个MAC算法),不包含key交换(key exchange)算法。key交换算法用来建立SSL session和各自的master secret。术语cipher suite包含了cipher spec和key交换算法。cipher suite包含key交换、Cipher和加密使用的Hash函数三个部分。每个cipher suite编码成两个字节。
如果加密保护由消息认证和加密组成,有三种组合方式:
SSL协议使用secret key实现消息认证大批量数据加密。在加密前,客户端和服务器之间要建立密钥材料。材料源于master secret,每个master secret包含48个字节。
有三种key交换算法(RSA, Diffie-Hellman和FORTEZZA)可以建立这样的pre_master_secret。不认证实体的key交换叫匿名的。
DHE有安全优势。对于TLS1.3尤其如此,它要求任何key交换都是短暂的。
key交换的结果是pre_master_secret,一旦建立了pre_master_secret,可以用来构造master_secret。master_secret表示一个SSL session的状态元素。
它可能是这样构造的:
master_secret =
MD5(pre_master_secret + SHA(’A’ + pre_master_secret
+ ClientHello.random + ServerHello.random)) +
MD5(pre_master_secret + SHA(’BB’ + pre_master_secret
+ ClientHello.random + ServerHello.random)) +
MD5(pre_master_secret + SHA(’CCC’ + pre_master_secret
+ ClientHello.random + ServerHello.random))
其中,SHA指的是SHA-1,’A’、’BB’和’CCC’是0x41、0x4242和0x434343。ClientHello.random和ServerHello.random是客户端和服务器随机选择的一对值,在SSL握手时交换。
有趣的是,不使用MD5或者SHA-1构造,而是组合了这两个加密hash函数。
MD5 hash值16个字节长, 所以,master secret的长度是48个字节。master secret是session状态的一部分,作为熵的来源,生成后面使用的所有加密参数。一旦构造好master secret,就可以删除pre_master_secret。
可以用相同的办法,生成任意长度的key块,叫key_block。master secret是种子,客户端和服务器的随机值是盐值,这样使得密码分析更困难。
SSL的cipher suite是一个加密hash函数,有些附加信息需要实际计算和验证MAC。SSL使用的算法的前任是HMAC。
SSL MAC算法基于HMAC,但是使用字符串级联,而不是XOR运算。
HMAC构造器是这样定义的:
HMACk(m) = h(k ⊕ opad k h(k ⊕ ipad k m))
其中,h是加密hash函数(MD5、SHA-1或者SHA-2),k是key(用于消息认证),m是被认证的消息,ipad(inner pad)是64个0x36,opad(outer pad)是64个0x5C,⊕是按位相加,取模2,k是连接操作。
SSL MAC构造器是这样定义的:
SSL MACk(SSLCompressed) = h(k || opad || h(k || ipad || seq_number || type || length || fragment ))
其中,SSLCompressed是认证的SSL结构(由type、version、length和fragment属性组成),h是加密hash函数,k是MAC write key,ipad和opad跟上面的相同。
如果使用stream cipher,不需要padding和IV。
如果使用block cipher:
type、version和length是SSL记录的头。SSL记录的fragment属性包含一个加密的,带有MAC的SSLCiphertext结构。
SSLCiphertext结构可能包含padding。无论如何,整个SSL记录在一个TCP segment中被发送给接收方。一个TCP segment可以包含多条记录。