discuz用户密码加密方式解析及忘记密码的解决办法

  • PHP二次开发
  • 2013-12-20 09:34
  • PHP二次开发网
  • 阅读(31699)
  • 评论(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.php2.cc/article-966-1.html

    相关阅读

    发表评论

    最新评论

    引用 网站源码   2016-7-19 17:09
    刚好需要这个,谢谢博主了

    查看全部评论(1)

    用户名:  *

    邮 箱:  *

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