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