SSL和TLS-SSL Record Protocol

SSL记录协议用来封装高层协议数据,它把数据分成可管理的片段,叫做fragments,然后单独处理。
每个fragment根据SSL session的压缩算法和加密模式做压缩和加密保护处理。
The SSL record processing (overview)

SSL记录处理过程可分为好几步。前四步是fragmentation、compression、message authentication和encryption。添加SSL记录头是第五步。fragmentation后返回的数据结构叫SSLPlaintext,compression后的叫SSLCompressed,加密保护后的(认证和加密)叫SSLCiphertext,它实际包含在SSL记录的fragment属性内。除了fragment,每个数据结构包含一个8-bit长的type属性,16-bit长的version属性,还有另一个16-bit长的length属性。

  • type:SSL高层协议
    • 20 (0x14):change cipher spec协议
    • 21 (0x15):alert协议
    • 22 (0x16):handshake协议
    • 23 (0x17):application data协议
  • version:使用的SSL协议的版本号。两个字节,表示major版本和minor版本。SSL 3.0就是0x0300。TLS 1.2是0x0303,TLS 1.3是0x0304 (3,4)
  • length:高层协议消息的字节长度(同一个类型的多个高层协议消息可以属于同一个SSL记录)。最大值不应该超过16383。

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编码成两个字节。
如果加密保护由消息认证和加密组成,有三种组合方式:

  • authenticate-then-encrypt(AtE):消息先认证(附加一个MAC)再加密。此时,包含MAC的encryption附加到消息上做认证
  • encrypt-then-authenticate(EtA):消息先加密再认证。此时,encryption不包含MAC
  • encrypt-and-authenticate(E&A):消息同时做加密和认证。此时,加密文本和MAC组合起来发给接受者

Key Exchange

SSL协议使用secret key实现消息认证大批量数据加密。在加密前,客户端和服务器之间要建立密钥材料。材料源于master secret,每个master secret包含48个字节。
有三种key交换算法(RSA, Diffie-Hellman和FORTEZZA)可以建立这样的pre_master_secret。不认证实体的key交换叫匿名的。

  • RSA:客户端生成pre_master_secret,使用服务器的公钥加密,把加密文本发给服务器。服务器的公钥,反过来,可以是长期的和可检索的证书,也可以是短期的。服务器使用私钥解密pre_master_secret
  • Diffie-Hellman:交换Diffie-Hellman key,返回的Diffie-Hellman值代表pre_master_secret。SSL协议支持三个版本的Diffie-Hellman key交换。推荐使用DHE
    • fixed Diffie-Hellman(DH):Diffie-Hellman key交换需要的参数是固定的,是各自的公钥证书的一部分。如果需要客户端认证,客户端的Diffie-Hellman参数是固定的,是客户端证书的一部分。如果不需要客户端认证,参数在握手期间生成的(ClientKeyExchange消息)
    • ephemeral Diffie-Hellman(DHE):Diffie-Hellman key交换的参数不是固定的,也不是公钥证书的一部分。参数在握手期间生成(ServerKeyExchange和ClientKeyExchange消息)。这样产生一个争议,standard group是否应该被用来DHE
      • 一方面,使用任意组(非标准组),容易导致跨协议攻击
      • 另一方面,对于很多标准组,通过预先计算,可以破坏DHE
    • anonymous Diffie-Hellman(DH anon):和DHE类似,但是缺少认证步骤,使Diffie-Hellman key交换变成了一个认证的key交换。这样,参加者不能确认对方是真实的。实际上,任何人都是合法的。容易受到中间人攻击
  • FORTEZZA:SSL 3.0支持,TLS不在支持。

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是种子,客户端和服务器的随机值是盐值,这样使得密码分析更困难。

  • client_write_MAC_secret和server_write_MAC_secret是认证key
  • client_write_key和server_write_key是加密key
  • client_write_IV和server_write_IV,如果CBC模式使用块加密,就需要这些IV

Message Authentication

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跟上面的相同。

Encryption

如果使用stream cipher,不需要padding和IV。
如果使用block cipher:

  • 首先需要padding,plaintext的长度应该是密码块长度的整数倍。比如,如果是DES或者3DES加密,plaintext必须是64位(8字节)的整数倍。SSL的padding格式和TLS的不一样。SSL和TLS的padding的最后一个字节是padding的长度。SSL的其他padding字节可以随机选择,而TLS的所有padding字节都是一样的。SSL的padding尽可能短。
  • 其次,一些加密模式需要IV。比如,CBC模式,SSL握手协议必须提供一个IV,它代表SSL连接的状态。这个IV接下来用来加密第一条记录。然后,每条记录的最后一个cipher文本块作为加密下一条记录的IV。这叫做IV链。

SSL Record Header

type、version和length是SSL记录的头。SSL记录的fragment属性包含一个加密的,带有MAC的SSLCiphertext结构。
SSLCiphertext结构可能包含padding。无论如何,整个SSL记录在一个TCP segment中被发送给接收方。一个TCP segment可以包含多条记录。

猜你喜欢

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