<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)航:
     
    主站蜘蛛池模板: 亚洲AV成人精品日韩一区 | 人成电影网在线观看免费| 成年丰满熟妇午夜免费视频| 国产亚洲Av综合人人澡精品| 国产aⅴ无码专区亚洲av麻豆 | 亚洲视频免费在线播放| 一个人免费观看在线视频www| 国外亚洲成AV人片在线观看| 久久国产免费观看精品3| 456亚洲人成在线播放网站| 亚洲综合国产精品第一页| 国产91免费在线观看| 四虎影视在线看免费观看| 亚洲国产成人久久综合一区| 亚洲一区二区精品视频| 99久久99久久精品免费看蜜桃| 亚洲高清无在码在线电影不卡| 中文在线观看免费网站| 亚洲色精品VR一区区三区| 一本久久a久久精品亚洲| 女人18毛片a级毛片免费| 7m凹凸精品分类大全免费| 免费国产va视频永久在线观看| 免费一级毛片不卡不收费| 色影音免费色资源| 三上悠亚在线观看免费| 国产成人精品日本亚洲语音| 亚洲香蕉免费有线视频| 亚洲精品无码鲁网中文电影| 成年女人喷潮毛片免费播放| 十八禁无码免费网站| 精品久久久久久国产免费了| 亚洲av成本人无码网站| 亚洲六月丁香婷婷综合| 亚洲尹人香蕉网在线视颅| 最新精品亚洲成a人在线观看| 日本免费一区二区久久人人澡| 亚洲av日韩av无码| 亚洲国产综合精品中文字幕| 成人免费视频网址| 免费看美女裸露无档网站|