<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當(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工具類我們可以迅速做到這一點(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ù)記錄:


    到此啰嗦完了,感謝您看到這里。
    posted on 2010-11-27 13:56 何楊 閱讀(7914) 評(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)航:
     
    主站蜘蛛池模板: 日韩精品亚洲专区在线观看| 免费v片在线观看视频网站| 免费做爰猛烈吃奶摸视频在线观看| 亚洲精品国精品久久99热一| 一级毛片免费在线观看网站| 亚洲av无码乱码在线观看野外 | 9久热这里只有精品免费| 亚洲天堂中文字幕在线| 国产免费A∨在线播放| 国产偷国产偷亚洲清高动态图| 免费看一级高潮毛片| 国产精品四虎在线观看免费| 免费无码专区毛片高潮喷水| 国产精品亚洲二区在线观看| 三级黄色片免费看| 久久精品亚洲视频| 国产精品视频免费| 久久精品国产亚洲AV未满十八| 免费一级特黄特色大片在线| 色多多www视频在线观看免费| 久久亚洲色一区二区三区| 国产午夜无码精品免费看动漫| 久久久亚洲欧洲日产国码农村| 精品香蕉在线观看免费| 亚洲AV色欲色欲WWW| 中文字幕亚洲一区二区三区| 免费视频成人手机在线观看网址| 久久亚洲AV无码精品色午夜| 破了亲妺妺的处免费视频国产| 一级毛片高清免费播放| 亚洲色图在线播放| 午夜成年女人毛片免费观看| 一进一出60分钟免费视频| 亚洲AV区无码字幕中文色| 毛色毛片免费观看| 中文字幕视频免费在线观看| 中文字幕亚洲男人的天堂网络 | 免费人成视频在线| 一级毛片a免费播放王色| 久久99亚洲网美利坚合众国| 国产精品色午夜免费视频|