一、SSL協(xié)商
由于非對稱加密的速度比較慢睦柴,所以它一般用于密鑰交換诽凌,雙方通過公鑰算法協(xié)商出一份密鑰,然后通過對稱加密來通信坦敌,當然侣诵,為了保證數(shù)據(jù)的完整性,在加密前要先經(jīng)過HMAC的處理狱窘。
SSL缺省只進行server端的認證杜顺,客戶端的認證是可選的。以下是其流程圖(摘自TLS協(xié)議)蘸炸。
Client? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Server
ClientHello? ? ? ? ? ? ? ? ? -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ? ? ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished ? ? ? ? ? ? ? ? ? ? ?-------->
[ChangeCipherSpec]
<-------- ? ? ?Finished
Application Data
<------->? ? Application Data
簡單的說便是:SSL客戶端(也是TCP的客戶端)在TCP鏈接建立之后躬络,發(fā)出一個ClientHello來發(fā)起握手,這個消息里面包含了自己可實現(xiàn)的算法列表和其它一些需要的消息搭儒,SSL的服務(wù)器端會回應(yīng)一個ServerHello穷当,這里面確定了這次通信所需要的算法提茁,然后發(fā)過去自己的證書(里面包含了身份和自己的公鑰)。Client在收到這個消息后會生成一個秘密消息馁菜,用SSL服務(wù)器的公鑰加密后傳過去茴扁,SSL服務(wù)器端用自己的私鑰解密后,會話密鑰協(xié)商成功火邓,雙方可以用同一份會話密鑰來通信了丹弱。
密鑰協(xié)商的形象化比喻:
如果上面的說明不夠清晰德撬,這里我們用個形象的比喻铲咨,我們假設(shè)A與B通信,A是SSL客戶端蜓洪,B是SSL服務(wù)器端纤勒,加密后的消息放在方括號[]里,以突出明文消息的區(qū)別隆檀。雙方的處理動作的說明用圓括號()括起摇天。
A:我想和你安全的通話,我這里的對稱加密算法有DES,RC5,密鑰交換算法有RSA和DH恐仑,摘要算法有MD5和SHA泉坐。
B:我們用DES-RSA-SHA這對組合好了。
這是我的證書裳仆,里面有我的名字和公鑰腕让,你拿去驗證一下我的身份(把證書發(fā)給A)。
目前沒有別的可說的了歧斟。
A:(查看證書上B的名字是否無誤纯丸,并通過手頭早已有的CA的證書驗證了B的證書的真實性,如果其中一項有誤静袖,發(fā)出警告并斷開連接觉鼻,這一步保證了B的公鑰的真實性)
(產(chǎn)生一份秘密消息,這份秘密消息處理后將用作加密密鑰队橙,加密初始化向量和hmac的密鑰坠陈。將這份秘密消息-協(xié)議中稱為
per_master_secret-用B的公鑰加密,封裝成稱作ClientKeyExchange的消息捐康。由于用了B的公鑰畅姊,保證了第三方無法竊聽)
我生成了一份秘密消息,并用你的公鑰加密了吹由,給你(把ClientKeyExchange發(fā)給B)
注意若未,下面我就要用加密的辦法給你發(fā)消息了!
(將秘密消息進行處理倾鲫,生成加密密鑰粗合,加密初始化向量和hmac的密鑰)
[我說完了]
B:(用自己的私鑰將ClientKeyExchange中的秘密消息解密出來萍嬉,然后將秘密消息進行處理,生成加密密鑰隙疚,加密初始化向量和hmac的密鑰壤追,這時雙方已經(jīng)安全的協(xié)商出一套加密辦法了)
注意,我也要開始用加密的辦法給你發(fā)消息了供屉!
[我說完了]
A: [我的秘密是...]
B: [其它人不會聽到的...]
加密的計算
上一步講了密鑰的協(xié)商行冰,但是還沒有闡明是如何利用加密密鑰,加密初始化向量和hmac的密鑰來加密消息的伶丐。
其實其過程不過如此:
1 借助hmac的密鑰悼做,對明文的消息做安全的摘要處理,然后和明文放到一起哗魂。
2 借助加密密鑰肛走,加密初始化向量加密上面的消息。
二录别、秘鑰交換
ssl3_send_client_key_exchange是openssl中客戶端確定密鑰的函數(shù)朽色,同時也發(fā)送了“一部分”數(shù)據(jù)給服務(wù)器,這一部分數(shù)據(jù)就是所謂的pre_master组题,不管是客戶端還是服務(wù)器都根據(jù)對端傳過來的pre_master和自己計算出來的另一部分數(shù)據(jù)來生成最終的對稱密鑰葫男,生成過程中需要hello消息中的隨機數(shù),這樣生成的密鑰才不會每次都一樣崔列。由于ssl協(xié)議中dh份額來源于證書梢褐,而證書又是靜態(tài)的,因此十分有必要引入一種隨機因素來保證通過靜態(tài)證書導(dǎo)出的密鑰份額協(xié)商出來的密鑰的隨機性峻呕。同時這也是pre_master的意義利职,那就是隨機,對于rsa密鑰交換算法來說瘦癌,pre-master-key本身就是一個隨機數(shù)猪贪,再加上hello消息中的隨機,三個隨機數(shù)通過一個密鑰導(dǎo)出器最終導(dǎo)出一個對稱密鑰讯私,但是對于dh热押,包括ecdh算法(不考慮匿名dh和瞬時dh),就只有hello消息中的兩個隨機數(shù)因子了斤寇。
pre master的存在在于ssl協(xié)議不信任每個主機都能產(chǎn)生完全隨機的隨機數(shù)桶癣,如果隨機數(shù)不隨機,那么pre master secret就有可能被猜出來娘锁,那么僅適用pre master secret作為密鑰就不合適了牙寞,因此必須引入新的隨機因素,那么客戶端和服務(wù)器加上pre master secret三個隨機數(shù)一同生成的密鑰就不容易被猜出了,一個偽隨機可能完全不隨機间雀,可是是三個偽隨機就十分接近隨機了悔详,每增加一個自由度,隨機性增加的可不是一惹挟。
迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange茄螃,簡稱“D–H”) 是一種安全協(xié)議。
它可以讓雙方在完全沒有對方任何預(yù)先信息的條件下通過不安全信道建立起一個密鑰连锯。這個密鑰可以在后續(xù)的通訊中作為對稱密鑰來加密通訊內(nèi)容
(1)归苍、算法描述
離散對數(shù)的概念:
原根:如果a是素數(shù)p的一個原根,那么數(shù)值:
amodp运怖,a^2modp拼弃,…,a^(p-1)modp
是各不相同的整數(shù)驳规,且以某種排列方式組成了從1到p-1的所有整數(shù)肴敛。
離散對數(shù):如果對于一個整數(shù)b和素數(shù)p的一個原根a署海,可以找到一個唯一的指數(shù)i吗购,使得:
b=(a的i次方)modp其中0≦i≦p-1
那么指數(shù)i稱為b的以a為基數(shù)的模p的離散對數(shù)。
Diffie-Hellman算法的有效性依賴于計算離散對數(shù)的難度砸狞,其含義是:當已知大素數(shù)p和它的一個原根a后捻勉,對給定的b,要計算i刀森,被認為是很困難的踱启,而給定i計算b卻相對容易。
Diffie-Hellman算法:
假如用戶A和用戶B希望交換一個密鑰研底。
取素數(shù)p和整數(shù)a埠偿,a是p的一個原根,公開a和p榜晦。
A選擇隨機數(shù)XA<p冠蒋,并計算YA=a^XA mod p。
B選擇隨機數(shù)XB<p乾胶,并計算YB=a^XB mod p抖剿。
每一方都將X保密而將Y公開讓另一方得到。
A計算密鑰的方式是:K=(YB) ^XA modp
B計算密鑰的方式是:K=(YA) ^XB modp
證明:
(YB)^ XA modp= (a^XB modp)^ XA modp
= (a^XB)^ XA modp= (a^XA) ^XB modp(<-- 密鑰即為 a^(XA*XB) modp)
=(a^XA modp)^ XB modp= (YA) ^XB modp
由于XA和XB是保密的识窿,而第三方只有p斩郎、a、YB喻频、YA可以利用缩宜,只有通過取離散對數(shù)來確定密鑰,但對于大的素數(shù)p甥温,計算離散對數(shù)是十分困難的锻煌。
例子:
假如用戶Alice和用戶Bob希望交換一個密鑰膜宋。
取一個素數(shù)p=97和97的一個原根a=5。
Alice和Bob分別選擇秘密密鑰XA=36和XB=58炼幔,并計算各自的公開密鑰:
YA=a^XA modp=5^36 mod 97=50
YB=a^XB modp=5^58 mod 97=44
Alice和Bob交換了公開密鑰之后秋茫,計算共享密鑰如下:
Alice:K=(YB) ^XA modp=44^36 mod 97=75
Bob:K=(YA) ^XB modp=50^58 mod 97=75
當然乃秀,為了使這個例子變得安全肛著,必須使用非常大的XA,?XB 以及p, 否則可以實驗所有的可能取值跺讯。(總共有最多97個這樣的值, 就算XA和XB很大也無濟于事)枢贿。
如果p是一個至少 300 位的質(zhì)數(shù),并且XA和XB至少有100位長刀脏, 那么即使使用全人類所有的計算資源和當今最好的算法也不可能從a,p和a^(XA*XB) modp中計算出 XA*XB局荚。
這個問題就是著名的離散對數(shù)問題。注意g則不需要很大, 并且在一般的實踐中通常是2或者5愈污。
在最初的描述中耀态,迪菲-赫爾曼密鑰交換本身并沒有提供通訊雙方的身份驗證服務(wù),因此它很容易受到中間人攻擊暂雹。
一個中間人在信道的中央進行兩次迪菲-赫爾曼密鑰交換首装,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob杭跪,反之亦然仙逻。
而攻擊者可以解密(讀取和存儲)任何一個人的信息并重新加密信息,然后傳遞給另一個人涧尿。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊系奉。
有很多種安全身份驗證解決方案使用到了迪菲-赫爾曼密鑰交換。例如當Alice和Bob共有一個公鑰基礎(chǔ)設(shè)施時姑廉,他們可以將他們的返回密鑰進行簽名缺亮。