陳坤定
(閩西職業(yè)技術(shù)學(xué)院 計算機系,福建 龍巖 364021)
Java Web作為目前構(gòu)建web應(yīng)用系統(tǒng)、支持動態(tài)處理的程序設(shè)計技術(shù),在市場上已經(jīng)表現(xiàn)出非常強大的生命力。利用這種技術(shù)可以建立先進(jìn)、安全和跨平臺的動態(tài)網(wǎng)站,很多企業(yè)也都采用J2EE來構(gòu)建企業(yè)門戶網(wǎng)站及B/S系統(tǒng)。無論是動態(tài)網(wǎng)站還是B/S系統(tǒng),一般都有登錄模塊,而登錄模塊中包含用戶名和密碼等用戶敏感內(nèi)容。很多系統(tǒng)登錄模塊在設(shè)計時都是將密碼以明文的形式進(jìn)行存儲,然后在此基礎(chǔ)上提供取回密碼的服務(wù),這很容易使用戶的隱密信息被泄漏出去。而且將密碼以明文的方式存儲在數(shù)據(jù)庫中,將使擁有數(shù)據(jù)庫訪問權(quán)限的人可以輕而易舉的獲取用戶密碼,并假借用戶名稱進(jìn)行操作,這勢必給用戶造成很大的損失。所以將用戶信息存儲在數(shù)據(jù)庫的時候,很有必要對這些信息進(jìn)行加密處理,使具有數(shù)據(jù)庫操作權(quán)限的人無法獲得用戶的具體信息,以避免給用戶造成損失。在眾多的加密方法中,消息摘要算法中的MD5、SHA等雖然已經(jīng)被王小云教授破解,已不是很安全,但是對于一般的用戶和公司,用算法來破解消息摘要算法還是很困難的。因此,它仍然還是較為優(yōu)秀安全的加密算法[1]。
消息摘要算法是將任意長度的“字節(jié)串”變換成一個固定位數(shù)的大整數(shù),并且是一個不可逆的字符串變換算法。消息摘要算法的典型應(yīng)用是對一段字節(jié)串產(chǎn)生指紋,以防止消息在傳輸過程中被“篡改”,從而保證數(shù)據(jù)的完整性[2]。
另外,它還廣泛應(yīng)用在加密和解密技術(shù)上,在Java Web系統(tǒng)中,可以用來加密敏感的賬號或密碼等信息。
用戶注冊時,有些系統(tǒng)只對密碼而沒有對用戶名進(jìn)行摘要處理,這樣容易使一些有不良企圖的、能夠訪問數(shù)據(jù)庫企業(yè)內(nèi)部員工,將能很輕松地利用同樣的摘要算法生成新密碼,對用戶的舊密碼進(jìn)行覆蓋,然后用新的密碼登錄冒充用戶的身份做一些有損用戶利益的操作。而且有的人在覆蓋密碼以前,先把原來的舊密碼保存起來,等操作完成后,再將舊密碼存回數(shù)據(jù)庫,這樣用戶比較難以發(fā)現(xiàn),即使用戶發(fā)現(xiàn)進(jìn)行投訴后,企業(yè)也很難找到任何的蛛絲馬跡。所以為更好的提高安全性,一并將用戶名、密碼等信息進(jìn)行摘要處理,然后把摘要信息存入數(shù)據(jù)庫中,將是一個正確的選擇。其注冊過程見序列圖1。
登錄時,對輸入的用戶名、密碼,即明文進(jìn)行摘要處理(僅限于明文到密文的轉(zhuǎn)換,摘要算法不可逆,不能從密文轉(zhuǎn)換成明文),將處理的摘要信息通過數(shù)據(jù)庫進(jìn)行查詢。登錄過程見序列圖2。

圖1 用戶注冊過程

圖2 用戶登錄過程
摘要算法在Java Web中的具體實現(xiàn)可以通過java.security包的MessageDigest類或者Apache commons的DigestUtils工具類來完成。第一種方法是由SUN公司提供的面向底層的算法,缺少相應(yīng)的進(jìn)制轉(zhuǎn)換實現(xiàn),無法將其字節(jié)數(shù)組形式的摘要信息轉(zhuǎn)為十六進(jìn)制字符串,使用不是很方便。第二種方法支持多種形式的支持,支持十六進(jìn)制形式的摘要信息,使用較為方便[2]。
在JAVA6中使用摘要算法比較簡單,只要導(dǎo)入java.security包使用MessageDigetst類生成一個JavaBean就可以在JavaWeb系統(tǒng)中使用。
具體過程:
(1)編寫JavaBean


其中方法MDEncrypt()是將字符串in進(jìn)行消息摘要處理,并將得到的十六進(jìn)制字符---信息摘要通過另一個方法byteToString()轉(zhuǎn)換為字符串。
(2)將MDEncoder部署到系統(tǒng)中。
(3)使用摘要加密功能。
①調(diào)用MDEncoder.MDEncrypt()對初始注冊的用戶名和密碼進(jìn)行摘要加密并保存到數(shù)據(jù)庫中。
②用戶登錄時,將用戶名和密碼進(jìn)行摘要加密,然后將加密后的信息摘要和數(shù)據(jù)庫提取的數(shù)據(jù)進(jìn)行對比。
在JSP系統(tǒng)中的具體參考代碼如下:


可以利用Apache commons的DigestUtils工具類,它實際上對sun提供的摘要算法實現(xiàn)做了一個簡單的包裝,但卻為使用該算法提供了方便。DigestUtils類位于org.apache.commons.codec.digest包中,因此,應(yīng)首先下載commons-codec-1.x.jar包,并將其導(dǎo)入JSP系統(tǒng)中,然后將上述JSP頁面稍加修改即可[3]。
通過消息摘要算法在Java Web的應(yīng)用,可以極大的提高信息安全性,但消息摘要算法有其局限性,因為其是不可逆的,密方不能轉(zhuǎn)換為明文。所以,它一般使用在注冊登錄、消息傳遞等只需進(jìn)行數(shù)據(jù)安整性驗證的場合,而在一些需要把密文轉(zhuǎn)換成明文的地方則不適合使用消息摘要算法。
[1]梁棟.Java加密解與解密的藝術(shù)[M].北京:機械工業(yè)出版社,2010.
[2]王常吉.信息與網(wǎng)絡(luò)安全實驗教程[M].北京:清華大學(xué)出版社,2007.
[3]何揚.使用MD5對存放在數(shù)據(jù)庫中用戶密碼進(jìn)行保護(hù)[EB/OL].(2011-11-27)[2012-02-13].http://www.blogjava.net/heyang/archive/2012/02/13/339188.html.