在做项目时候需要集成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、插入用户数据方案
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/
分享到:
相关推荐
主要介绍了php用户密码加密算法,较为详细的分析了Discuz加密算法的原理,并结合实例形式对比了.net算法的实现方法总结了php进行用户加密的流程与实现方法,需要的朋友可以参考下
Seay Discuz用户密码暴力破解器
Discuz用户密码暴力破解器
NULL 博文链接:https://xieruilin.iteye.com/blog/780774
共六种PHP加解密方法, 其中包含非常给力的authcode加密函数,Discuz!经典代码(带详解) 函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示...
discuz注册时,会把密码按一个规则加密。 比如我的密码是123456 复制代码 代码如下:echo md5(“123456”); 会输出: 复制代码 代码如下:e10adc3949ba59abbe56e057f20f883e 而数据库的值却为: 复制代码 代码如下:...
主要介绍了Discuz论坛密码与密保加密规则的相关资料,需要的朋友可以参考下
NT 3.0采用了一系列加密算法来保证安全性,Discuz!NT 官方发布的API应用都可以放心使用,第三方开发的应用需要经过Discuz!NT 官方认证,用户大可以放心使用。Discuz!NT 3.0的API的又一大改进是支持客户端调用,基于...
NULL 博文链接:https://tcrct.iteye.com/blog/1047207
discuz discuz密码找回 discuz忘记密码 discuz密码重置 详细介绍见http://luyugao.com/Soft_Share/29/
在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言)。这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原。 除了这个之外,还有AES这个算法能够将数据很好的加密起来...
1、新增扭曲变换加密算法,加密算法增加至4种,加密算法混用可以达到奇效; 2、新增加密强度分级显示; 3、改进RSA加密算法; 4、新增内存保护功能; V2016版重要更新: 1、加密视频可以设置保留原始格式,也可以...
Discuz!NT用户使用手册 Discuz!NT用户使用手册
5、非对称加密算法采用国际上最高强度加密算法,技术上领先国内和国外其他软件整整两代,可谓视频加密领域的第五代战机! 6、可启用高清播放,图像放大播放边缘依然平滑,不产生锯齿,颜色不失真; 7、酷炫视频水印...
5、非对称加密算法采用国际上最高强度加密算法,技术上领先国内和国外其他软件整整两代,可谓视频加密领域的第五代战机! 6、可启用高清播放,图像放大播放边缘依然平滑,不产生锯齿,颜色不失真; 7、酷炫视频水印...
discuz 2.0x用户中心批量导入论坛用户 放在根目录运行