投稿 评论 顶部
 手机版 | 登陆 | 注册 | 留言 | 设首页 | 加收藏

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

佚名 discuz教程
  首先找到文件: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加密一次。