1. 程式人生 > >SSL和TLS-TLS 介紹

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

根據需要的輸出位長度,這個擴充套件函式可以執行任意多次。它是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的長度是不一樣的。