以下文章屬于老調(diào)重彈,您如果對(duì)MD5的使用已經(jīng)熟悉請(qǐng)不要往下看以免浪費(fèi)寶貴時(shí)間。
登錄Web系統(tǒng)時(shí)通常都采用用戶名和密碼的形式,如果這樣的數(shù)據(jù)以明碼的方式放在數(shù)據(jù)庫(kù)中的話無(wú)疑會(huì)給別有用心的人以可趁之機(jī),所以采取一定的防范措施是必要的。
現(xiàn)在比較安全的方式是用MD5進(jìn)行加密,利用Apache commons的DigestUtils工具類我們可以迅速做到這一點(diǎn)。
要得到Apache commons的DigestUtils工具類,你必須加載commons-codec-1.x.jar包,我使用的是commons-codec-1.3.jar。使用的具體類是:org.apache.commons.codec.digest.DigestUtils.
下面,我們的任務(wù)是,當(dāng)用戶注冊(cè)時(shí),將他注冊(cè)的密碼加密后存入數(shù)據(jù)庫(kù),下面請(qǐng)見(jiàn)具體代碼:
1 // 對(duì)密碼進(jìn)行加密,加密后再通過(guò)Hibernate往數(shù)據(jù)庫(kù)里存
2 String changedPswd=DigestUtils.md5Hex(pswd);
3
4 User user=new User(name,changedPswd,email,brief);
5
6 if(service.hasSameName(name)){
7 // 同名檢測(cè)
8 request.setAttribute("msg", "已經(jīng)有和'"+name+"'同名的用戶存在了,請(qǐng)換個(gè)名稱注冊(cè).");
9 return new ActionForward("/web/page/register.jsp");
10 }
11
12 if(service.hasSameEmail(email)){
13 // 同Emial檢測(cè)
14 request.setAttribute("msg", "已經(jīng)有和'"+email+"'相同的用戶存在了,請(qǐng)換個(gè)Email注冊(cè).");
15 return new ActionForward("/web/page/register.jsp");
16 }
17
18 try{
19 service.create(user);
20 saveUserRegisterInforToLog(user,request);
21 request.setAttribute("msg", ""+name+",歡迎您的加盟.???????¼???");
22 return new ActionForward("/web/page/login.jsp");
23 }
24 catch(Exception ex){
25 String str="創(chuàng)建用戶時(shí)遇到未預(yù)計(jì)的異常,具體的異常信息為'"+ex.getMessage()+"',請(qǐng)與系統(tǒng)維護(hù)人員聯(lián)系.";
26 request.setAttribute("msg",str );
27 logger.fatal(str);
28 return new ActionForward("/web/page/register.jsp");
29 }
以上第二行代碼是進(jìn)行MD5加密的處理,如果用戶輸入的密碼是123456789,則會(huì)得到25f9e794323b453885f5181f1b624d0b這樣的字符串。
注冊(cè)用戶后,數(shù)據(jù)庫(kù)中您將看到如下的對(duì)應(yīng)記錄,看到這樣的文字,要去反猜原始密碼是非常困難的,當(dāng)然您有山東大學(xué)王小云教授的本事則不費(fèi)吹灰之力。
下面,我們還要對(duì)登錄時(shí)做一番處理,因?yàn)榈卿洉r(shí)用的是原始密碼,我們應(yīng)該對(duì)它進(jìn)行加密后再和數(shù)據(jù)庫(kù)中的對(duì)應(yīng)字段進(jìn)行比對(duì),代碼如下:
User user=objs.get(0);
// 得到MD5加密后的密碼
String changedPswd=DigestUtils.md5Hex(password);
// 再與數(shù)據(jù)庫(kù)中用戶密碼進(jìn)行比對(duì)
if(user.getPassword().equals(changedPswd)==false){
throw new ErrorPswdException("密碼不匹配.");
}else{
return user;
}
以上代碼中,password是用戶在頁(yè)面輸入的原始密碼,changedPswd是經(jīng)過(guò)MD5加密后的密碼,user是按名稱查詢出來(lái)的用戶,他的密碼部分就是已經(jīng)經(jīng)過(guò)MD5加密的,我們拿這兩個(gè)密碼進(jìn)行比對(duì)即可。
之所以沒(méi)有反向還原是因?yàn)镸D5加密和Base64不一樣,前者是不可逆的,后者則可以還原。當(dāng)然,Base64不是嚴(yán)格意義上的加密手段。
最后的問(wèn)題,如果數(shù)據(jù)庫(kù)中原有數(shù)據(jù)未經(jīng)加密怎么辦,好在MySql數(shù)據(jù)庫(kù)提供了md5函數(shù)幫我們做到這一點(diǎn),使用update projectmanager_user set pswd=
md5(pswd
) 這樣的語(yǔ)句就可以將原來(lái)數(shù)據(jù)庫(kù)中的密碼部分用MD5加密了。
下面的圖片演示了這一過(guò)程:
原始數(shù)據(jù):
使用update projectmanager_user set pswd=md5(pswd)加密后的數(shù)據(jù)庫(kù)記錄:
到此啰嗦完了,感謝您看到這里。