陳坤定
(閩西職業(yè)技術學院 計算機系,福建 龍巖 364021)
Java Web作為目前構建web應用系統(tǒng)、支持動態(tài)處理的程序設計技術,在市場上已經表現出非常強大的生命力。利用這種技術可以建立先進、安全和跨平臺的動態(tài)網站,很多企業(yè)也都采用J2EE來構建企業(yè)門戶網站及B/S系統(tǒng)。無論是動態(tài)網站還是B/S系統(tǒng),一般都有登錄模塊,而登錄模塊中包含用戶名和密碼等用戶敏感內容。很多系統(tǒng)登錄模塊在設計時都是將密碼以明文的形式進行存儲,然后在此基礎上提供取回密碼的服務,這很容易使用戶的隱密信息被泄漏出去。而且將密碼以明文的方式存儲在數據庫中,將使擁有數據庫訪問權限的人可以輕而易舉的獲取用戶密碼,并假借用戶名稱進行操作,這勢必給用戶造成很大的損失。所以將用戶信息存儲在數據庫的時候,很有必要對這些信息進行加密處理,使具有數據庫操作權限的人無法獲得用戶的具體信息,以避免給用戶造成損失。在眾多的加密方法中,消息摘要算法中的MD5、SHA等雖然已經被王小云教授破解,已不是很安全,但是對于一般的用戶和公司,用算法來破解消息摘要算法還是很困難的。因此,它仍然還是較為優(yōu)秀安全的加密算法[1]。
消息摘要算法是將任意長度的“字節(jié)串”變換成一個固定位數的大整數,并且是一個不可逆的字符串變換算法。消息摘要算法的典型應用是對一段字節(jié)串產生指紋,以防止消息在傳輸過程中被“篡改”,從而保證數據的完整性[2]。
另外,它還廣泛應用在加密和解密技術上,在Java Web系統(tǒng)中,可以用來加密敏感的賬號或密碼等信息。
用戶注冊時,有些系統(tǒng)只對密碼而沒有對用戶名進行摘要處理,這樣容易使一些有不良企圖的、能夠訪問數據庫企業(yè)內部員工,將能很輕松地利用同樣的摘要算法生成新密碼,對用戶的舊密碼進行覆蓋,然后用新的密碼登錄冒充用戶的身份做一些有損用戶利益的操作。而且有的人在覆蓋密碼以前,先把原來的舊密碼保存起來,等操作完成后,再將舊密碼存回數據庫,這樣用戶比較難以發(fā)現,即使用戶發(fā)現進行投訴后,企業(yè)也很難找到任何的蛛絲馬跡。所以為更好的提高安全性,一并將用戶名、密碼等信息進行摘要處理,然后把摘要信息存入數據庫中,將是一個正確的選擇。其注冊過程見序列圖1。
登錄時,對輸入的用戶名、密碼,即明文進行摘要處理(僅限于明文到密文的轉換,摘要算法不可逆,不能從密文轉換成明文),將處理的摘要信息通過數據庫進行查詢。登錄過程見序列圖2。
圖1 用戶注冊過程
圖2 用戶登錄過程
摘要算法在Java Web中的具體實現可以通過java.security包的MessageDigest類或者Apache commons的DigestUtils工具類來完成。第一種方法是由SUN公司提供的面向底層的算法,缺少相應的進制轉換實現,無法將其字節(jié)數組形式的摘要信息轉為十六進制字符串,使用不是很方便。第二種方法支持多種形式的支持,支持十六進制形式的摘要信息,使用較為方便[2]。
在JAVA6中使用摘要算法比較簡單,只要導入java.security包使用MessageDigetst類生成一個JavaBean就可以在JavaWeb系統(tǒng)中使用。
具體過程:
(1)編寫JavaBean
其中方法MDEncrypt()是將字符串in進行消息摘要處理,并將得到的十六進制字符---信息摘要通過另一個方法byteToString()轉換為字符串。
(2)將MDEncoder部署到系統(tǒng)中。
(3)使用摘要加密功能。
①調用MDEncoder.MDEncrypt()對初始注冊的用戶名和密碼進行摘要加密并保存到數據庫中。
②用戶登錄時,將用戶名和密碼進行摘要加密,然后將加密后的信息摘要和數據庫提取的數據進行對比。
在JSP系統(tǒng)中的具體參考代碼如下:
可以利用Apache commons的DigestUtils工具類,它實際上對sun提供的摘要算法實現做了一個簡單的包裝,但卻為使用該算法提供了方便。DigestUtils類位于org.apache.commons.codec.digest包中,因此,應首先下載commons-codec-1.x.jar包,并將其導入JSP系統(tǒng)中,然后將上述JSP頁面稍加修改即可[3]。
通過消息摘要算法在Java Web的應用,可以極大的提高信息安全性,但消息摘要算法有其局限性,因為其是不可逆的,密方不能轉換為明文。所以,它一般使用在注冊登錄、消息傳遞等只需進行數據安整性驗證的場合,而在一些需要把密文轉換成明文的地方則不適合使用消息摘要算法。
[1]梁棟.Java加密解與解密的藝術[M].北京:機械工業(yè)出版社,2010.
[2]王常吉.信息與網絡安全實驗教程[M].北京:清華大學出版社,2007.
[3]何揚.使用MD5對存放在數據庫中用戶密碼進行保護[EB/OL].(2011-11-27)[2012-02-13].http://www.blogjava.net/heyang/archive/2012/02/13/339188.html.