當柳上原的風吹向天際的時候...

          真正的快樂來源于創(chuàng)造

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          以下文章屬于老調重彈,您如果對MD5的使用已經熟悉請不要往下看以免浪費寶貴時間。

          登錄Web系統(tǒng)時通常都采用用戶名和密碼的形式,如果這樣的數據以明碼的方式放在數據庫中的話無疑會給別有用心的人以可趁之機,所以采取一定的防范措施是必要的。

          現在比較安全的方式是用MD5進行加密,利用Apache commons的DigestUtils工具類我們可以迅速做到這一點。
          要得到Apache commons的DigestUtils工具類,你必須加載commons-codec-1.x.jar包,我使用的是commons-codec-1.3.jar。使用的具體類是:org.apache.commons.codec.digest.DigestUtils.

          下面,我們的任務是,當用戶注冊時,將他注冊的密碼加密后存入數據庫,下面請見具體代碼:
           1 // 對密碼進行加密,加密后再通過Hibernate往數據庫里存
           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""已經有和'"+name+"'同名的用戶存在了,請換個名稱注冊.");
           9             return new ActionForward("/web/page/register.jsp");
          10         }
          11         
          12         if(service.hasSameEmail(email)){
          13             // 同Emial檢測
          14             request.setAttribute("msg""已經有和'"+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這樣的字符串。

          注冊用戶后,數據庫中您將看到如下的對應記錄,看到這樣的文字,要去反猜原始密碼是非常困難的,當然您有山東大學王小云教授的本事則不費吹灰之力。


          下面,我們還要對登錄時做一番處理,因為登錄時用的是原始密碼,我們應該對它進行加密后再和數據庫中的對應字段進行比對,代碼如下:
                      User user=objs.get(0);
                      
                      
          // 得到MD5加密后的密碼
                      String changedPswd=DigestUtils.md5Hex(password);
                          
                      
          // 再與數據庫中用戶密碼進行比對
                      if(user.getPassword().equals(changedPswd)==false){
                          
          throw new ErrorPswdException("密碼不匹配.");
                      }
          else{
                          
          return user;


                      }

          以上代碼中,password是用戶在頁面輸入的原始密碼,changedPswd是經過MD5加密后的密碼,user是按名稱查詢出來的用戶,他的密碼部分就是已經經過MD5加密的,我們拿這兩個密碼進行比對即可。

          之所以沒有反向還原是因為MD5加密和Base64不一樣,前者是不可逆的,后者則可以還原。當然,Base64不是嚴格意義上的加密手段。

          最后的問題,如果數據庫中原有數據未經加密怎么辦,好在MySql數據庫提供了md5函數幫我們做到這一點,使用update projectmanager_user set pswd=md5(pswd) 這樣的語句就可以將原來數據庫中的密碼部分用MD5加密了。

          下面的圖片演示了這一過程:

          原始數據:


          使用update projectmanager_user set pswd=md5(pswd)加密后的數據庫記錄:


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

          Feedback

          # re: 使用MD5對存放在數據庫中用戶密碼進行保護 2012-02-13 10:25 asd
          既然能打開數據數,人家可以直接把密碼改了  回復  更多評論
            

          # re: 使用MD5對存放在數據庫中用戶密碼進行保護 2012-02-13 10:53 何楊
          @asd

          你說的有道理。

          可以用MD5的方式生成一個新密碼,再用update語句進行替換原密碼操作就可以了。

          因此數據庫也應該有自己的保護措施。  回復  更多評論
            

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

          # re: 使用MD5對存放在數據庫中用戶密碼進行保護[未登錄] 2016-08-09 13:17 Dr
          請問一下你那個service.hasSameName(name) 里面的service 是哪里得到的?  回復  更多評論
            


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


          網站導航:
           
          主站蜘蛛池模板: 平和县| 迁安市| 法库县| 东丽区| 务川| 马鞍山市| 万山特区| 阿尔山市| 京山县| 伽师县| 辛集市| 滦平县| 尤溪县| 静乐县| 青田县| 湘乡市| 桃园市| 贵阳市| 普安县| 崇仁县| 正镶白旗| 关岭| 宜州市| 新沂市| 盐津县| 安吉县| 观塘区| 水城县| 阿拉善右旗| 蒲江县| 喀喇沁旗| 揭阳市| 中超| 溧水县| 济源市| 汉阴县| 靖边县| 贵定县| 安塞县| 锦屏县| 工布江达县|