Discuz! 6.1 用户密码的存放和生成方式

  自 Discuz! 6.1 以后,装 Discuz! 就必须安装 UCenter。经过分析,事实上自从跟 UCenter 集成以后,Discuz! 的用户密码就不是存放在 Discuz! 自己的 cdb_members 表里了,而是放在 UCenter 库里的 uc_members 表里。

  Discuz! 目录下的 register.php,其中向 cdb_members 表里插数据时密码的生成方式如下:

  1.  $password = md5( random( 10 ) );
  2.  ?>

只是用一个随机数的 MD5 值填充了用户密码字段,这跟 admin/members.inc.php 里的做法是一样的,根本没有使用用户自己输入的密码(可见即便 hacker 拿到了 Discuz! 库中用户表的数据,也没办法用 MD5 碰撞的方法找出一个可以登录的用户密码)。

  真正的用户密码保存在 UCenter 库的 uc_members 表里,代码在 uc_client/model/user.php 里:

  1.  function add_user($username, $password, $email, $uid = 0)
  2.  {
  3.      $salt = substr(uniqid(rand()), -6);
  4.      $password = md5(md5($password).$salt);
  5.      $sqladd = $uid ? 'uid=\''.intval($uid).'\',' : '';
  6.      //$appid = UC_APPID;
  7.      $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='".$this->base->onlineip."', regdate='".$this->base->time."', salt='$salt'");
  8.      $uid = $this->db->insert_id();
  9.      $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
  10.      return $uid;
  11.  }
  12.  ?>

(UC_DBTABLEPRE 的定义是 define(‘UC_DBTABLEPRE’, ‘`ucenter`.uc_’);)可以看出来,这里的密码生成算法跟生成 UCenter 创始人密码的算法是一样的,都是用一个加扰串结合原始密码的 MD5 再做一次 MD5。

  知道了以上原理,就可以手工对用户名密码做一些处理了。

Leave a Reply