Discuz! 6.1 用户密码的存放和生成方式
2009-4-12 13:00 | by 2ndboy自 Discuz! 6.1 以后,装 Discuz! 就必须安装 UCenter。经过分析,事实上自从跟 UCenter 集成以后,Discuz! 的用户密码就不是存放在 Discuz! 自己的 cdb_members 表里了,而是放在 UCenter 库里的 uc_members 表里。
Discuz! 目录下的 register.php,其中向 cdb_members 表里插数据时密码的生成方式如下:
- $password = md5( random( 10 ) );
- ?>
只是用一个随机数的 MD5 值填充了用户密码字段,这跟 admin/members.inc.php 里的做法是一样的,根本没有使用用户自己输入的密码(可见即便 hacker 拿到了 Discuz! 库中用户表的数据,也没办法用 MD5 碰撞的方法找出一个可以登录的用户密码)。
真正的用户密码保存在 UCenter 库的 uc_members 表里,代码在 uc_client/model/user.php 里:
- function add_user($username, $password, $email, $uid = 0)
- {
- $salt = substr(uniqid(rand()), -6);
- $password = md5(md5($password).$salt);
- $sqladd = $uid ? 'uid=\''.intval($uid).'\',' : '';
- //$appid = UC_APPID;
- $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'");
- $uid = $this->db->insert_id();
- $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
- return $uid;
- }
- ?>
(UC_DBTABLEPRE 的定义是 define(‘UC_DBTABLEPRE’, ‘`ucenter`.uc_’);)可以看出来,这里的密码生成算法跟生成 UCenter 创始人密码的算法是一样的,都是用一个加扰串结合原始密码的 MD5 再做一次 MD5。
知道了以上原理,就可以手工对用户名密码做一些处理了。


