ssl3_send_client_key_exchange是openssl中用戶端确定密鑰的函數,同時也發送了“一部分”資料給伺服器,這一部分資料就是所謂的pre_master,不管是用戶端還是伺服器都根據對端傳過來的pre_master和自己計算出來的另一部分資料來生成最終的對稱密鑰,生成過程中需要hello消息中的随機數,這樣生成的密鑰才不會每次都一樣。由于ssl協定中dh份額來源于證書,而證書又是靜态的,是以十分有必要引入一種随機因素來保證通過靜态證書導出的密鑰份額協商出來的密鑰的随機性。同時這也是pre_master的意義,那就是随機,對于rsa密鑰交換算法來說,pre-master-key本身就是一個随機數,再加上hello消息中的随機,三個随機數通過一個密鑰導出器最終導出一個對稱密鑰,但是對于dh,包括ecdh算法(不考慮匿名dh和瞬時dh),就隻有hello消息中的兩個随機數因子了。
pre master的存在在于ssl協定不信任每個主機都能産生完全随機的随機數,如果随機數不随機,那麼pre master secret就有可能被猜出來,那麼僅适用pre master secret作為密鑰就不合适了,是以必須引入新的随機因素,那麼用戶端和伺服器加上pre master secret三個随機數一同生成的密鑰就不容易被猜出了,一個僞随機可能完全不随機,可是是三個僞随機就十分接近随機了,每增加一個自由度,随機性增加的可不是一。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271798