1. 程式人生 > >SSL和TLS-SSL Record Protocol

SSL和TLS-SSL Record Protocol

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可以包含多條記錄。