|
網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來(lái)的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲(chǔ)資源、數(shù)據(jù)資源、信息資源、知識(shí)資源、專家資源、大型數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 經(jīng)常有讀者詢問(wèn),如何在其站點(diǎn)上使用JavaScript,以確保用戶登錄時(shí)的口令不會(huì)外泄。對(duì)于這樣的問(wèn)題,我的第一反應(yīng)就是告訴他們使用SSL(安全套接字協(xié)議層)。如使用正確,SSL對(duì)于安全要求較高的Web應(yīng)用是最佳的解決方案。但是,也有相當(dāng)一部分開(kāi)發(fā)者,他們的Web應(yīng)用對(duì)安全性的要求并不高,因此他們并不希望訪問(wèn)者使用SSL 登錄。 Web應(yīng)用一般使用一種叫做“會(huì)話狀態(tài)管理”(Session State Management) 的技術(shù)來(lái)追蹤和管理瀏覽器與服務(wù)器之間的相互活動(dòng)。因?yàn)槊總(gè)瀏覽器的瀏覽要求相對(duì)于其他瀏覽器都是獨(dú)立的(正如超文本傳輸協(xié)議中定義的那樣),所以Web 應(yīng)用必然使用某些技巧,如Cookie、隱藏表格字段、或重寫URL,它們可以識(shí)別出服務(wù)器與某個(gè)瀏覽器進(jìn)行的獨(dú)立會(huì)話。大多數(shù)的服務(wù)器端編程環(huán)境(如ASP、PHP、ColdFusion等)都使用Cookie。 會(huì)話狀態(tài)管理的問(wèn)題在于從根本上講它是不安全的。這些被用來(lái)管理會(huì)話狀態(tài)的Cookie、表單值、或URL要在瀏覽器和服務(wù)器之間往來(lái)傳送,黑客可以在途中攔截它們。一旦攔截成功,黑客就可以利用這些信息強(qiáng)行接管用戶會(huì)話。 在大多數(shù)服務(wù)器端腳本編寫環(huán)境里,你都可以采取一些措施以減少此類泄密的發(fā)生。例如,你可以為Cookie設(shè)定很短的使用期限,應(yīng)用“難預(yù)期會(huì)話狀態(tài)”信息。然而,最安全的解決方案還是使用SSL。使用SSL,不論用戶口令,還是會(huì)話狀態(tài)信息都會(huì)受到保護(hù)。 如果你不使用SSL,那么可以要求用戶對(duì)你的應(yīng)用中的每個(gè)敏感頁(yè)進(jìn)行重新認(rèn)證。但是,從用戶的角度來(lái)講,這種方式未免太過(guò)麻煩?傊,你必須清楚你和你的用戶究竟愿意承擔(dān)多高的風(fēng)險(xiǎn)。如果口令泄露的風(fēng)險(xiǎn)過(guò)高,你就需要使用SSL建立應(yīng)用。如果你不能使用SSL,可以采用基于MD5的登錄方式作為代替。它至少可以保護(hù)你的用戶的口令免于外泄。另外,再選用一種可以防止會(huì)話狀態(tài)信息被竊的服務(wù)器端腳本編寫技術(shù)。 通常,如果一個(gè)用戶不使用SSL登錄(即原來(lái)的HTTP),那么從離開(kāi)瀏覽器直到到達(dá)目標(biāo)網(wǎng)絡(luò)服務(wù)器的這段時(shí)間里,用戶口令都處于無(wú)保護(hù)的暴露狀態(tài),正如下頁(yè)中的圖表所示。 不過(guò),我們可以利用一種不可逆的函數(shù)開(kāi)發(fā)一種登錄方案,利用這種方案就不會(huì)暴露用戶的口令。函數(shù)是集合的元素之間的一種對(duì)應(yīng)關(guān)系,在從集合A到集合B的函數(shù)中,A中每個(gè)元素在B中都有一個(gè)唯一的元素與之相對(duì)應(yīng)。不可逆函數(shù)在計(jì)算上很難逆轉(zhuǎn)——即給定集合B中的一個(gè)元素,很難確定在集合A中的哪個(gè)元素與之相對(duì)應(yīng)。 這好比是一臺(tái)碎紙機(jī)。把文件放入碎紙機(jī)中銷毀是很容易的。但是反之,如果要把銷毀后的碎紙屑重新拼湊成原文可就難上加難了。 <B>采用MD5解決方案<B> 當(dāng)今最流行的不可逆函數(shù)應(yīng)用程序之一就是由Ronald Rivest開(kāi)發(fā)的MD5算法。Ronald Rivest還是著名的RSA(Rivest,Shamir,Adelman)加密算法的開(kāi)發(fā)者之一。MD5算法能為任何長(zhǎng)度的信息生成一個(gè)16字節(jié)大小的“數(shù)字指紋”。這個(gè)信息可以是一個(gè)字符串、一個(gè)文件、一個(gè)文本流或任何其它形式的字節(jié)序列。在RFC1321中有MD5算法的詳細(xì)描述。 我們要開(kāi)發(fā)一種使用MD5算法的登錄方式,用以保護(hù)從一個(gè)瀏覽器發(fā)送至網(wǎng)絡(luò)服務(wù)器的用戶口令。 當(dāng)一名用戶對(duì)某個(gè)網(wǎng)絡(luò)應(yīng)用提出登錄請(qǐng)求時(shí),其網(wǎng)絡(luò)服務(wù)器就會(huì)提供給用戶一個(gè)登錄表格。這是一個(gè)帶有隨機(jī)生成值的表格。其中的隨機(jī)生成值由服務(wù)器端腳本從一個(gè)數(shù)億記的取值空間中隨機(jī)選取生成。 <img src="http://edu.chinaz.com/UpLoadFiles/NewsPhoto/esastep1.gif"> 用戶在登錄表格中輸入他或她的用戶名和口令,用戶端腳本給口令附加一個(gè)隨機(jī)值,然后用MD5不可逆算法對(duì)結(jié)果進(jìn)行計(jì)算。再用計(jì)算得出的值代替原口令。我把這個(gè)值稱為MD5口令。 最后,用戶端腳本把用戶名和這個(gè)MD5口令發(fā)送到網(wǎng)絡(luò)服務(wù)器。因?yàn)樵跒g覽器與服務(wù)器之間傳送的是MD5的運(yùn)算結(jié)果,所以任何人都無(wú)法通過(guò)計(jì)算得出用戶所輸入的原始口令。 <img src="http://edu.chinaz.com/UpLoadFiles/NewsPhoto/esastep2.gif"> 網(wǎng)絡(luò)服務(wù)器在接收用戶名和MD5口令后,會(huì)執(zhí)行與用戶瀏覽器相同的運(yùn)算。它給用戶口令(從服務(wù)器的被保護(hù)區(qū)域中提。└郊由想S機(jī)值(即已發(fā)送給用戶的隨機(jī)值),并計(jì)算出正確的MD5口令值。然后網(wǎng)絡(luò)應(yīng)用程序把這個(gè)值和它從瀏覽器收取的值相比較。如果兩值相等,網(wǎng)絡(luò)應(yīng)用程序就會(huì)生成一個(gè)服務(wù)器端會(huì)話變量,證明此用戶身份正確。 <img src="http://edu.chinaz.com/UpLoadFiles/NewsPhoto/esastep3.gif"> 說(shuō)到這里,你也許會(huì)置疑使用隨機(jī)值的必要性。其實(shí),這個(gè)隨機(jī)值是用來(lái)防止再度攻擊的。如果只有原始用戶口令通過(guò)MD5,那么相應(yīng)得出的MD5口令就會(huì)總是同一個(gè)值。黑客只要截獲MD5口令就同樣可以登錄進(jìn)入網(wǎng)絡(luò)應(yīng)用。使用了隨機(jī)值后,每次登錄時(shí)生成的MD5口令都是唯一的,這樣就避免了上述問(wèn)題的出現(xiàn)。 <B>JavaScript實(shí)現(xiàn)</B> 在JavaScript中實(shí)現(xiàn)使用MD5加密的登錄方案是比較容易的。Paul Johnston 的站點(diǎn)為您提供了MD5算法實(shí)現(xiàn)的豐富資料。其它有關(guān)MD5的信息可以在此站點(diǎn)中找到。請(qǐng)將代碼 拷貝至一個(gè)文本文件,并命名為md5-js.txt。 我們將在ASP環(huán)境下完成服務(wù)器端的腳本編寫(因?yàn)锳SP支持JScript——微軟版的JavaScript)。你可以使用任何一種服務(wù)器端腳本編寫語(yǔ)言,但是你必須把MD5算法翻譯成你所選擇的語(yǔ)言。 網(wǎng)絡(luò)的神奇作用吸引著越來(lái)越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來(lái)越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢(shì),對(duì)應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!