當(dāng)柳上原的風(fēng)吹向天際的時(shí)候...

          真正的快樂(lè)來(lái)源于創(chuàng)造

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          以下文章屬于老調(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工具類(lèi)我們可以迅速做到這一點(diǎn)。
          要得到Apache commons的DigestUtils工具類(lèi),你必須加載commons-codec-1.x.jar包,我使用的是commons-codec-1.3.jar。使用的具體類(lèi)是: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è)名稱(chēng)注冊(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是按名稱(chēng)查詢出來(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ù)記錄:


          到此啰嗦完了,感謝您看到這里。
          posted on 2010-11-27 13:56 何楊 閱讀(7920) 評(píng)論(4)  編輯  收藏

          Feedback

          # re: 使用MD5對(duì)存放在數(shù)據(jù)庫(kù)中用戶密碼進(jìn)行保護(hù) 2012-02-13 10:25 asd
          既然能打開(kāi)數(shù)據(jù)數(shù),人家可以直接把密碼改了  回復(fù)  更多評(píng)論
            

          # re: 使用MD5對(duì)存放在數(shù)據(jù)庫(kù)中用戶密碼進(jìn)行保護(hù) 2012-02-13 10:53 何楊
          @asd

          你說(shuō)的有道理。

          可以用MD5的方式生成一個(gè)新密碼,再用update語(yǔ)句進(jìn)行替換原密碼操作就可以了。

          因此數(shù)據(jù)庫(kù)也應(yīng)該有自己的保護(hù)措施。  回復(fù)  更多評(píng)論
            

          # re: 使用MD5對(duì)存放在數(shù)據(jù)庫(kù)中用戶密碼進(jìn)行保護(hù) 2015-11-20 09:25 發(fā)給
          發(fā)送到發(fā)送到第三方是的  回復(fù)  更多評(píng)論
            

          # re: 使用MD5對(duì)存放在數(shù)據(jù)庫(kù)中用戶密碼進(jìn)行保護(hù)[未登錄](méi) 2016-08-09 13:17 Dr
          請(qǐng)問(wèn)一下你那個(gè)service.hasSameName(name) 里面的service 是哪里得到的?  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 舟山市| 崇左市| 南投市| 泸定县| 清涧县| 开化县| 秦安县| 巢湖市| 南投市| 上高县| 乐至县| 石景山区| 岫岩| 忻城县| 澳门| 汝阳县| 北宁市| 郑州市| 新蔡县| 齐河县| 长乐市| 任丘市| 新沂市| 保德县| 吉林省| 岚皋县| 武冈市| 鸡西市| 巴马| 老河口市| 白山市| 汕尾市| 游戏| 渑池县| 桑日县| 电白县| 隆化县| 沙洋县| 华坪县| 星子县| 铜川市|