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的長度是不一樣的。