Hash
ServerKeyExchange 中 TLS 1.2 伺服器簽名中包含的參數
在 TLS 1.2
7.4.3
的標准文件部分中,Server Key Exchange Message
它說數字簽名涵蓋的參數如下:dh_p 用於 Diffie-Hellman 運算的素數模數。
dh_g 用於 Diffie-Hellman 操作的生成器。
dh_Ys 伺服器的 Diffie-Hellman 公共值 (g^X mod p)。
這些參數首先被散列。我的問題是:當計算這些參數的雜湊值時,它是通過這些參數的串聯計算的嗎?還是它們以任何其他方式結合在一起?
第 7.4.3 節規定了這一點:
struct { select (KeyExchangeAlgorithm) { case dh_anon: ServerDHParams params; case dhe_dss: case dhe_rsa: ServerDHParams params; digitally-signed struct { opaque client_random[32]; opaque server_random[32]; ServerDHParams params; } signed_params; case rsa: case dh_dss: case dh_rsa: struct {} ; /* message is omitted for rsa, dh_dss, and dh_rsa */ /* may be extended, e.g., for ECDH -- see [TLSECC] */ }; } ServerKeyExchange;
的含義在4.7 節
digitally-signed
中解釋。在這種情況下,上面的意思是簽名算法的輸入(即散列的)是按順序連接的:
- 客戶端隨機(32 字節),由客戶端在
ClientHello
;- 伺服器隨機(32 字節),由伺服器在
ServerHello
;- 結構的編碼
ServerDHParams
。這是完整的編碼,包括長度字節。該
ServerDHParams
結構本身定義為:struct { opaque dh_p<1..2^16-1>; opaque dh_g<1..2^16-1>; opaque dh_Ys<1..2^16-1>; } ServerDHParams; /* Ephemeral DH parameters */
因此,在散列函式中,緊隨客戶端和伺服器隨機數的 64 個字節之後,是編碼長度的兩個字節
dh_p
,然後是dh_p
; 那麼這兩個字節的長度為dh_g
,那麼dh_g
; 最後,兩個字節的長度為dh_Ys
,則dh_Ys
。由於該
ServerDHParams
結構本身是作為 的一部分通過線路發送的ServerKeyExchange
,因此可以更簡單地考慮如下:簽名的內容正是客戶端隨機數、伺服器隨機數和編碼 的字節的串聯ServerDHParams
,如發送和接收。