出家如初,成佛有余

Discuz BBS及SNS用户密码加密算法

Posted in Uncategorized by chuanliang on 2008/12/07

    在做项目时候需要集成discuz bbs、ucenter、ucenter home各个系统,这就要求自己的系统在进行用户注册时候同步在bbs、sns中增加对应的用户信息,由于discuz的各系统密码都为非明文串,因此要做到Discuz的用户帐户体系与业务系统同步,必然面临Discuz 用户密码加密算法问题。同时与同时由于有近百万的老的用户数据需要能够导入到bbs、sns的数据库中,因此方案应当支持批量导入操作。

1、可选方案

  • 程序通过ajax方式或httpclient模拟调用discuz ucenter home及bbs的注册url地址,提交接口所需要的各种参数完成注册操作

    此种方案中最为关键的是需要处理formhash问题,其他参数相对容易。

    在单个用户注册时候可以通过ajax方式或httpclient调用sns及bbs的注册接口自动完成注册。但在需要导入将近百万的老的用户数据时候,采用url接口调用方式性能太差,需要能够批量导入用户注册。    

  • 绕过web前端,从后端程序直接把用户注册数据插入数据库表中

    采用此种方案相对灵活,不用再受web前端的各种逻辑限制,同时对于大数据量导入也较好处理,因此采用此种方案。   

 

2、Discuz BBS及SNS密码加密算法

    Discuz SNS及BBS的密码采用非明文方式,加密算法如下(采用mysql函数方式描述):

        md5(concat(md5(‘password’),salt))

    其中salt为各用户在uc_members表中salt字段存放的随机串,实际上就是md5算法中的salt随机串,在批量导入时候,为方便起见,可以采用统一的字符串,我们测试暂且采用123456

    算法描述在ucenter/model/user.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'];
}

function add_user($username, $password, $email, $uid = 0) {
        $salt = substr(uniqid(rand()), -6);
        $password = md5(md5($password).$salt);
        $sqladd = $uid ? 'uid=''.intval($uid).'',' : '';
        //$appid = $this->base->app[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;
} 

3、插入用户数据方案

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

    insert into uc_members (uid,username,password,salt) values(id,‘username’, md5(concat(md5(‘password’),’123456′)),’123456’);

    insert into cdb_members (uid,username,password, groupid) values(id,‘username’, md5(concat(md5(‘password’),’123456′)),12);

    insert into cdb_memberfields(uid,nickname) values(id,’username’);

其中:

    id为max(uid)+10,uid本身在bbs、sns数据库中是自增的,但为保证3个表数据uid的同步,因此由程序指定uid,而不是自增方式。

    123456为salt值

    例如:

    insert into uc_members (uid,username,password,salt) values(203,’test5′, md5(concat(md5(‘test5′),’123456′)),’123456’);

    insert into cdb_members (uid,username,password, groupid) values(203,’test5′, md5(concat(md5(‘test5′),’123456’)),12);

    insert into cdb_memberfields(uid,nickname) values(203,’test5′);

   采用此种方案简单测试了一下,应该能够自动完成用户在BBS、Ucenter home中的自动登录,而且登录bbs时候不需要用户进行激活操作。先凑合用用,有空再完善相关功能。

4、表结构

  • uc_members表结构:

CREATE TABLE `uc_members` (

  `uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,

  `username` char(15) NOT NULL DEFAULT ”,

  `password` char(32) NOT NULL DEFAULT ”,

  `email` char(32) NOT NULL DEFAULT ”,

  `myid` char(30) NOT NULL DEFAULT ”,

  `myidkey` char(16) NOT NULL DEFAULT ”,

  `regip` char(15) NOT NULL DEFAULT ”,

  `regdate` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `lastloginip` int(10) NOT NULL DEFAULT ‘0’,

  `lastlogintime` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `salt` char(6) NOT NULL,

  PRIMARY KEY (`uid`),

  UNIQUE KEY `username` (`username`)

) ENGINE=MyISAM AUTO_INCREMENT=194 DEFAULT CHARSET=utf8

  • cdb_members表结构

CREATE TABLE `cdb_members` (

  `uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,

  `username` char(15) NOT NULL DEFAULT ”,

  `password` char(32) NOT NULL DEFAULT ”,

  `secques` char(8) NOT NULL DEFAULT ”,

  `gender` tinyint(1) NOT NULL DEFAULT ‘0’,

  `adminid` tinyint(1) NOT NULL DEFAULT ‘0’,

  `groupid` smallint(6) unsigned NOT NULL DEFAULT ‘0’,

  `groupexpiry` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `extgroupids` char(20) NOT NULL DEFAULT ”,

  `regip` char(15) NOT NULL DEFAULT ”,

  `regdate` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `lastip` char(15) NOT NULL DEFAULT ”,

  `lastvisit` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `lastactivity` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `lastpost` int(10) unsigned NOT NULL DEFAULT ‘0’,

  `posts` mediumint(8) unsigned NOT NULL DEFAULT ‘0’,

  `digestposts` smallint(6) unsigned NOT NULL DEFAULT ‘0’,

  `oltime` smallint(6) unsigned NOT NULL DEFAULT ‘0’,

  `pageviews` mediumint(8) unsigned NOT NULL DEFAULT ‘0’,

  `credits` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits1` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits2` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits3` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits4` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits5` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits6` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits7` int(10) NOT NULL DEFAULT ‘0’,

  `extcredits8` int(10) NOT NULL DEFAULT ‘0’,

  `email` char(40) NOT NULL DEFAULT ”,

  `bday` date NOT NULL DEFAULT ‘0000-00-00’,

  `sigstatus` tinyint(1) NOT NULL DEFAULT ‘0’,

  `tpp` tinyint(3) unsigned NOT NULL DEFAULT ‘0’,

  `ppp` tinyint(3) unsigned NOT NULL DEFAULT ‘0’,

  `styleid` smallint(6) unsigned NOT NULL DEFAULT ‘0’,

  `dateformat` tinyint(1) NOT NULL DEFAULT ‘0’,

  `timeformat` tinyint(1) NOT NULL DEFAULT ‘0’,

  `pmsound` tinyint(1) NOT NULL DEFAULT ‘0’,

  `showemail` tinyint(1) NOT NULL DEFAULT ‘0’,

  `newsletter` tinyint(1) NOT NULL DEFAULT ‘0’,

  `invisible` tinyint(1) NOT NULL DEFAULT ‘0’,

  `timeoffset` char(4) NOT NULL DEFAULT ”,

  `newpm` tinyint(1) NOT NULL DEFAULT ‘0’,

  `accessmasks` tinyint(1) NOT NULL DEFAULT ‘0’,

  `editormode` tinyint(1) unsigned NOT NULL DEFAULT ‘2’,

  `customshow` tinyint(1) unsigned NOT NULL DEFAULT ’26’,

  `xspacestatus` tinyint(1) NOT NULL DEFAULT ‘0’,

  `customaddfeed` tinyint(1) NOT NULL DEFAULT ‘0’,

  PRIMARY KEY (`uid`),

  UNIQUE KEY `username` (`username`),

  KEY `email` (`email`),

  KEY `groupid` (`groupid`)

) ENGINE=MyISAM AUTO_INCREMENT=194 DEFAULT CHARSET=utf8

  • cdb_memberfields表结构

CREATE TABLE `cdb_memberfields` (

  `uid` mediumint(8) unsigned NOT NULL DEFAULT ‘0’,

  `nickname` varchar(30) NOT NULL DEFAULT ”,

  `site` varchar(75) NOT NULL DEFAULT ”,

  `alipay` varchar(50) NOT NULL DEFAULT ”,

  `icq` varchar(12) NOT NULL DEFAULT ”,

  `qq` varchar(12) NOT NULL DEFAULT ”,

  `yahoo` varchar(40) NOT NULL DEFAULT ”,

  `msn` varchar(40) NOT NULL DEFAULT ”,

  `taobao` varchar(40) NOT NULL DEFAULT ”,

  `location` varchar(30) NOT NULL DEFAULT ”,

  `customstatus` varchar(30) NOT NULL DEFAULT ”,

  `medals` text NOT NULL,

  `avatar` varchar(255) NOT NULL DEFAULT ”,

  `avatarwidth` tinyint(3) unsigned NOT NULL DEFAULT ‘0’,

  `avatarheight` tinyint(3) unsigned NOT NULL DEFAULT ‘0’,

  `bio` text NOT NULL,

  `sightml` text NOT NULL,

  `ignorepm` text NOT NULL,

  `groupterms` text NOT NULL,

  `authstr` varchar(20) NOT NULL DEFAULT ”,

  `spacename` varchar(40) NOT NULL,

  `buyercredit` smallint(6) NOT NULL DEFAULT ‘0’,

  `sellercredit` smallint(6) NOT NULL DEFAULT ‘0’,

  PRIMARY KEY (`uid`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

5、关于discuz的formhash问题的备注

    从目前研究的结果来看,discuz bbs的formhash有两种:登录(注销)的formhash和发帖(回帖)的formhash

    获取discuz bbs的formhash的方案如下(ucenter home的有空再研究,应该与此类似):

     在登陆前,首先在未登录状态下访问bbs登录url地址:http://www.yeeach.com/bbs/logging.php?action=login以获取登录formhash,然后使用此formhash进行正常的登录操作。

    在发帖前,首先访问发帖url地址http://www.yeeach.com/bbs/post.php?action=newthread&fid=101以获取发帖formahsh,然后使用此formhash进行正常的发帖操作。

 

6、参考文档

    http://www.akii.org/discuz_md5_salt/

 

No Responses Yet

Subscribe to comments with RSS.

  1. liyihai said, on 2009/06/15 at 13:19

    非常感谢

  2. Larry said, on 2010/07/02 at 10:09

    不错,我用上了~!多谢老大分享


发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: