欢迎来到源码交易网,为站长提供交易担保服务 访问移动版
站长交易首选担保平台!
酷客淘

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

日期: 2019-06-17 08:11:05 人气: -

首先找到文件: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加密后,再连接的,是从数据库中查到的对应的字符。