發(fā)信站:BBS水木清華站(FriNov1020:30:492000)
引用請(qǐng)指明原作/譯者fordesign@21cn.com
SSL(SecureSocketLayer)是netscape公司提出的主要用于web的安全通信標(biāo)準(zhǔn),分為2.0版和3.0版.TLS(TransportLayerSecurity)是IETF的TLS工作組在SSL3.0基礎(chǔ)之上提出的安全通信標(biāo)準(zhǔn),目前版本是1.0,即RFC2246.SSL/TLS提供的安全機(jī)制可以保證應(yīng)用層數(shù)據(jù)在互聯(lián)網(wǎng)絡(luò)傳輸不被監(jiān)聽(tīng),偽造和竄改.
一般情況下的網(wǎng)絡(luò)協(xié)議應(yīng)用中,數(shù)據(jù)在機(jī)器中經(jīng)過(guò)簡(jiǎn)單的由上到下的幾次包裝,就進(jìn)入網(wǎng)絡(luò),如果這些包被截獲的話,那么可以很容易的根據(jù)網(wǎng)絡(luò)協(xié)議得到里面的數(shù)據(jù).由網(wǎng)絡(luò)監(jiān)聽(tīng)工具可以很容易的做到這一點(diǎn)。
SSL就是為了加密這些數(shù)據(jù)而產(chǎn)生的協(xié)議,可以這么理解,它是位與應(yīng)用層和TCP/IP之間的一層,數(shù)據(jù)經(jīng)過(guò)它流出的時(shí)候被加密,再往TCP/IP送,而數(shù)據(jù)從TCP/IP流入之后先進(jìn)入它這一層被解密,同時(shí)它也能夠驗(yàn)證網(wǎng)絡(luò)連接倆端的身份。
它的主要功能就是倆個(gè):
一:加密解密在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包,同時(shí)保護(hù)這些數(shù)據(jù)不被修改,和偽造。
二:驗(yàn)證網(wǎng)絡(luò)對(duì)話中雙方的身份
SSL協(xié)議包含倆個(gè)子協(xié)議,一個(gè)是包協(xié)議,一個(gè)是握手協(xié)議。包協(xié)議是說(shuō)明SSL的數(shù)據(jù)包應(yīng)該如何封裝的。握手協(xié)議則是說(shuō)明通信雙方如何協(xié)商共同決定使用什么算法以及算法使用的key。很明顯包協(xié)議位于握手協(xié)議更下一層。我們暫時(shí)對(duì)包協(xié)議的內(nèi)容沒(méi)有興趣。
SSL握手過(guò)程說(shuō)簡(jiǎn)單點(diǎn)就是:通信雙方通過(guò)不對(duì)稱加密算法來(lái)協(xié)商好一個(gè)對(duì)稱加密算法以及使用的key,然后用這個(gè)算法加密以后所有的數(shù)據(jù)完成應(yīng)用層協(xié)議的數(shù)據(jù)交換。
握手一般都是由client發(fā)起的,SSL也不例外。
1client送給server它自己本身使用的ssl的version(ssl一共有三個(gè)version),加密算法的一些配置,和一些隨機(jī)產(chǎn)生的數(shù)據(jù),以及其他在SSL協(xié)議中需要用到的信息。
2server送給client它自己的SSL的version,加密算法的配置,隨機(jī)產(chǎn)生的數(shù)據(jù),還會(huì)用自己的私有密鑰加密SERVER-HELLO信息。Server還同時(shí)把自己的證書文件給送過(guò)去。同時(shí)有個(gè)可選的項(xiàng)目,就是server可以要求需要客戶的certificate。
3client就用server送過(guò)來(lái)的certificate來(lái)驗(yàn)證server的身份。如果server身份驗(yàn)證沒(méi)通過(guò),本次通信結(jié)束。通過(guò)證書驗(yàn)證之后,得到server的公共密鑰,解開(kāi)server送來(lái)的被其用私有密鑰加密過(guò)的SERVER-HELLO信息,看看對(duì)頭與否。如果不對(duì),說(shuō)明對(duì)方只有該server的公共密鑰而沒(méi)有私有密鑰,必是假的。通信告吹。
4client使用到目前為止所有產(chǎn)生了的隨機(jī)數(shù)據(jù)(sharedsecret),client產(chǎn)生本次握手中的premastersecret(這個(gè)步驟是有可能有server的參與的,由他們使用的加密算法決定),并且把這個(gè)用server的公共密鑰加密,送回給server.如果server要求需要驗(yàn)證client,那么client也需要自己把自己的證書送過(guò)去,同時(shí)送一些自己簽過(guò)名的數(shù)據(jù)過(guò)去。
SSL協(xié)議有倆種技術(shù)來(lái)產(chǎn)生sharedsecret(真不好意思,又是一個(gè)很難意譯的詞組),
一種是RSA,一種是EDH.
RSA就是我們上一章說(shuō)過(guò)的一種不對(duì)稱加密算法。首先server把自己的RSA公共密鑰送給client,client于是用這個(gè)key加密一個(gè)隨機(jī)產(chǎn)生的值(這個(gè)隨機(jī)產(chǎn)生的值就是sharedsecret),再把結(jié)果送給server.
EDH也是一種不對(duì)稱加密算法,但它與RSA不同的是,它好象沒(méi)有自己固定的公共密鑰和私有密鑰,都是在程序跑起來(lái)的時(shí)候產(chǎn)生的,用完就K掉。其他的步驟倆者就差不多了。
RSA,DSA,DH三種不對(duì)稱加密算法的區(qū)別也就在這里。RSA的密鑰固定,后倆個(gè)需要一個(gè)參數(shù)來(lái)臨時(shí)生成key.DH甚至要求雙方使用同樣的參數(shù),這個(gè)參數(shù)要事先指定。如果SSL庫(kù)沒(méi)有l(wèi)oad進(jìn)這個(gè)參數(shù),DH算法就沒(méi)辦法用。DSA沒(méi)研究過(guò)。
5Server驗(yàn)證完client的身份之后,然后用自己的私有密鑰解密得到premastersecret然后雙方利用這個(gè)premastersecret來(lái)共同協(xié)商,得到mastersecret.
6雙方用master一起產(chǎn)生真正的sessionkey,著就是他們?cè)谑O碌倪^(guò)程中的對(duì)稱加密的key了。這個(gè)key還可以用來(lái)驗(yàn)證數(shù)據(jù)完整性。雙方再交換結(jié)束信息。握手結(jié)束。
接下來(lái)雙方就可以用協(xié)商好的算法和key來(lái)用對(duì)稱加密算法繼續(xù)下面的過(guò)程了。
很簡(jiǎn)單吧?其實(shí)要復(fù)雜一些的,我簡(jiǎn)化了很多來(lái)說(shuō)。
不過(guò)還是有個(gè)問(wèn)題,喜歡搗蛋的人雖然看不懂他們?cè)诮涣餍┦裁矗鄹目偪梢园桑?br />
記得我們?cè)诩用芩惴ɡ锩娼榻B過(guò)的哈希算法嗎?就是為了對(duì)付這種搗蛋者的。在每次送信息的時(shí)候,附帶把整條信息的哈希值也送過(guò)去,接收方收到信息的時(shí)候,也把收到的內(nèi)容哈希一把,然后和對(duì)方送來(lái)的哈希值對(duì)比一下,看看是否正確。搗蛋者如果亂改通信內(nèi)容,哈希出來(lái)的值是不同的,那么就很容易被發(fā)現(xiàn)了。
但這樣子,搗蛋者至少可以學(xué)舌。他可以把之前監(jiān)聽(tīng)到的內(nèi)容重復(fù)發(fā)給某一方,而這些內(nèi)容肯定是正確的,無(wú)法驗(yàn)證出有問(wèn)題的。哎,SSL是怎么對(duì)付這種人的我還沒(méi)看出來(lái)。有篇文章說(shuō):多放點(diǎn)隨機(jī)數(shù)在信息里可以對(duì)付,我也沒(méi)去研究這句話是什么意思。