`
wanchong998
  • 浏览: 236121 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
在做项目时候需要集成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加密算法】

    这项技术的核心是利用加密算法来保护用户密码的安全,防止未授权用户获取到明文密码。在众多加密算法中,Discuz加密算法作为讨论的重点,实际上是一种特殊的MD5加密实践。 MD5(Message-Digest Algorithm 5)是一种...

    java MD5加密算法匹配Discuz用户表密码字段

    Java MD5加密算法在Discuz用户表密码字段中的应用 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转换为固定长度的输出,通常是一个128位的二进制数,常以32位的十六进制形式...

    浅谈discuz密码加密的方式

    在PHP 5.5及更高版本中,引入了`password_hash()`函数,它支持更安全的bcrypt、scrypt等算法,提供了一种更为可靠和方便的密码加密方式。这些现代加密函数能够自动生成盐值,并且适应未来的安全需求。 总的来说,...

    Seay Discuz用户密码暴力破解器

    Seay Discuz用户密码暴力破解器

    Discuz用户密码暴力破解器

    Discuz用户密码暴力破解器

    吴翰清 - 流行应用的加密算法实现缺陷与利用

    随后讨论了不同类型的加密算法,如流密码(Stream cipher)和分组密码(Block cipher),并强调了它们在处理数据时的不同特性,例如流密码可以处理任意长度的数据,而分组密码通常需要特定长度的块。 2. **模式分析**:...

    六个经典的PHP加密解密算法

    共六种PHP加解密方法, 其中包含非常给力的authcode加密函数,Discuz!经典代码(带详解) 函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示...

    修改discuz用户密码的方法

    - 找到需要修改密码的用户记录,`password`字段存储的是经过MD5加密并加上salt(随机字符串)后的值。 - 生成新的密码,可以使用PHP的`md5()`函数结合Discuz! 的salt生成新密码的加密串。 - 更新`password`字段,...

    discuz加密解密函数 java版

    Discuz是一款流行的开源社区论坛软件,其内部使用了一系列的加密算法来保护用户数据的安全,例如用户密码、论坛帖子等。在Java环境下复现这些加密解密函数对于开发者来说具有重要意义,可以用于开发与Discuz对接的第...

    discuz密码重置工具,找回忘记的密码

    的密码存储通常采用加盐哈希的方式,这意味着原始密码不会直接存储在数据库中,而是经过特定算法(例如MD5)和一个随机的盐值进行混合加密,这提高了安全性但同时也增加了密码重置的复杂性。因此,普通的密码找回...

    Discuz论坛密码与密保加密规则

    为了保障用户数据的安全,Discuz论坛设计了独特的密码与密保加密规则。以下详细解析了Discuz密码与密保的加密机制,以及它们如何被应用和存储。 首先,关于密码的加密规则。Discuz的密码加密采用了多重MD5算法,它...

    Discuz! X3找回重置管理员密码的方法.docx

    MD5是一种单向加密算法,也就是说一旦密码被加密,无法直接反转回原始密码。 重置管理员密码的步骤 1. 打开网站根目录下的子目录uc_server/data,找到文件config.inc.php、config/config_global.php和config/...

    discuz7.x同步登录退出修改密码

    7.x中,这个过程需要通过安全的加密方式存储和验证密码,比如使用哈希加盐算法。新密码的设置也需要符合一定的复杂度规则,防止弱密码。 - 密码修改后,同步更新到所有关联系统,确保各个系统上的密码一致。 4. *...

    第06天:基础入门-加密编码算法1

    - **带密码**:使用用户提供的密码进行加密,每个用户的加密结果不同。 - **带偏移**:在加密过程中加入固定或变化的偏移量,增加破解难度。 - **带位数**:改变输入数据的位数,比如填充或截断。 - **带模式**:...

    Discuz类型论坛登陆并取用户信息.rar

    2. **加密算法**:Discuz采用SHA1散列算法对用户密码进行加密,确保数据安全。在登录时,客户端需将明文密码与论坛设置的salt值结合,再经过SHA1算法计算出散列值,一同提交给服务器。 3. **验证码**:为了防止恶意...

    Discuz!NT用户使用手册

    NT用户使用手册》是一份专为Discuz!NT系统用户设计的详尽指南,旨在帮助用户更好地理解和操作这一强大的社区论坛软件。Discuz!NT是基于.NET平台开发的一款开源社区软件,它提供了丰富的功能和高度的可定制性,被广泛...

    Discuz2.5 用户组图标15组

    Discuz2.5是一款经典的社区论坛软件,以其强大的功能和易用性深受用户喜爱。在Discuz论坛系统中,用户组是一种管理用户权限和角色的重要方式。用户组图标则是用户在论坛中展示身份的一种视觉表现,它能直观地反映出...

    Discuz!NT 3.0.0 SQL Server正式版源码(bbs)

    NT 3.0采用了一系列加密算法来保证安全性,Discuz!NT 官方发布的API应用都可以放心使用,第三方开发的应用需要经过Discuz!NT 官方认证,用户大可以放心使用。Discuz!NT 3.0的API的又一大改进是支持客户端调用,基于...

Global site tag (gtag.js) - Google Analytics