discuz用戶密碼加密方式解析及忘記密碼的解決辦法

  • PHP二次開發
  • 2013-12-20 09:34
  • PHP二次開發網
  • 閱讀(34081)
  • 評論(1
  • 摘要: 然后用phpmyadmin連接數據庫,找到表格:pre_ucenter_members里面的salt對應的數字,把里面的數字放到剛才加密的那段字符的后面,然后在經過一次md5加密。復制下來這串字符,在phpmyadmin里面,編輯這個用戶的信息, ...
    首先找到文件:uc_client/model/user.php

    里面有一個函數:

    [代碼]php代碼:

    function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {
    
              $regip = empty($regip) ? $this->base->onlineip : $regip;
    
              $salt = substr(uniqid(rand()), -6);
    
              $password = md5(md5($password).$salt);
    
              $sqladd = $uid ? "uid='".intval($uid)."'," : '';
    
              $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";
    
              $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");
    
              $uid = $this->db->insert_id();
    
              $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
    
              return $uid;
    
         }


    這個是添加用戶到ucenter中的方法,注意里面這句話:

    $password = md5(md5($password).$salt);

    這里可以看到存儲到數據庫中的用戶密碼的加密方式:

    表中的密碼等于:用戶輸入的密碼經過md5加密,后面跟上一段字符串$salt之后,再md5加密一次。

    $salt這段字符串哪來的呢?

    看緊挨著上面的一段代碼:$salt = substr(uniqid(rand()), -6);

    解開了說,rand(),是一段隨機數,位數也不確定。

    uniqid(),是 基于以微秒計的當前時間,生成一個唯一的 ID。

    可以再php里面運行這句話:echo uniqid(rand());

    能夠得到一段數字與字母的組合的數字。

    substr是一段php截取字符串的方法。

    substr(uniqid(rand()), -6);可以分析為從后面往前截取6個字符。

    那么discuz存儲密碼的方式就得到了:用戶輸入密碼md5加密后,在連接上6個隨機字符然后md5加密一次。

    ————————分隔符————————————

    再看用戶登陸的驗證,還是這個文件,找到函數:

    [代碼]php代碼:

    function check_login($username, $password, &$user) {
    
              $user = $this->get_user_by_username($username);
    
              if(empty($user['username'])) {
    
                   return -1;
    
              } elseif($user['password'] != md5(md5($password).$user['salt'])) {
    
                   return -2;
    
              }
    
              return $user['uid'];
    
         }


    簡單解析:

    $user = $this->get_user_by_username($username);

    這句話是根據傳入的username來查詢數據庫(因為用戶名是唯一的)。獲取user的數組。

    下面判斷,如果得到的數組$user中的$user['username'])用戶名字段為空的話,就返回-1,如果$user數組里面的$user['password'] 不等于md5(md5($password).$user['salt'])則返回-2

    從這里看md5(md5($password).$user['salt']),就是把傳入的密碼md5加密一次,在連接$user數組中的$user['salt']字段,再進行一次md5加密。這個與插入用戶的時候密碼加密方式是相同的,只是這里的用戶輸入的密碼經過md5加密后,再連接的,是從數據庫中查到的對應的字符。

    —————————分割線—————————————

    查看數據庫表格:pre_ucenter_members  的表結構:



    里面有一個 salt字段。這個字段即是后面跟的那個隨機數。即當插入用戶的時候,生成的那個隨機數。而且用戶登陸的時候,驗證用的隨機數,也是這個。

    ——————————分割線——————————————


    好了,分析完成,下面說下忘記密碼的解決方法。

    首先找到一個可以md5加密的網站(自己寫個也行):http://tool.chinaz.com/Tools/MD5.aspx

    記得選擇:32位(小)



    輸入你的密碼,點擊后面的加密,得到一串字符,保留好這串字符。

    然后用phpmyadmin連接數據庫,找到表格:pre_ucenter_members里面的salt對應的數字,把里面的數字放到剛才加密的那段字符的后面,然后在經過一次md5加密。復制下來這串字符,在phpmyadmin里面,編輯這個用戶的信息,把password這里對應的黏貼成這個,保存就行了。

    好了,分析完成。



    PHP技術交流QQ群:422137578

    除非注明,文章均為 PHP二次開發 原創,轉載請注明本文地址:http://www.fujvln.live/article-966-1.html

    相關閱讀

    發表評論

    最新評論

    引用 網站源碼   2016-7-19 17:09
    剛好需要這個,謝謝博主了

    查看全部評論(1)

    用戶名:  *

    郵 箱:  *

    網 址: 注意加上“http://”哦!