Discuz加密算法

在做項目時候需要集成discuzbbs、UCENTER、ucenterhome各個系統,這就要求自己的系統在進行用戶註冊時候同步在bbs、sns中增加對應的用戶信息,由於discuz的各系統密碼都為非明文串,因此要做到Discuz的用戶帳戶體系與業務系統同步,必然面臨Discuz用戶密碼加密算法問題。


DiscuzBBS及SNS用戶密碼加密算法
同時與同時由於有近百萬的老的用戶數據需要能夠導入到bbs、sns的資料庫中,因此方案應當支持批量導入操作。
1、可選方案
*程式通過ajax方式或httpclient模擬調用discuzucenterhome及bbs的註冊url地址,提交接口所需要的各種參數完成註冊操作
此種方案中最為關鍵的是需要處理formhash問題,其他參數相對容易。
在單個用戶註冊時候可以通過ajax方式或httpclient調用sns及bbs的註冊接口自動完成註冊。但在需要導入將近百萬的老的用戶數據時候,採用url接口調用方式性能太差,需要能夠批量導入用戶註冊。
*繞過web前端,從後端程式直接把用戶註冊數據插入資料庫表中
採用此種方案相對靈活,不用再受web前端的各種邏輯限制,同時對於大數據量導入也較好處理,因此採用此種方案。
2、DiscuzBBS及SNS密碼加密算法
DiscuzSNS及BBS的密碼採用非明文方式,加密算法如下(採用MySQL函式方式描述):
md5(concat(md5(‘password’),salt))
其中salt為各用戶在uc_members表中salt欄位存放的隨機串,實際上就是MD5算法中的salt隨機串,在批量導入時候,為方便起見,可以採用統一的字元串,我們測試暫且採用123456
算法描述在ucenter/model/user.php中:
functioncheck_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'];
}
functionadd_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("INSERTINTO".UC_DBTABLEPRE."membersSET$sqladdusername='$username',password='$password',email='$email',regip='".$this->base->onlineip."',regdate='".$this->base->time."',salt='$salt'");
$uid=$this->db->insert_id();
$this->db->query("INSERTINTO".UC_DBTABLEPRE."memberfieldsSETuid='$uid'");
return$uid;
}
3、插入用戶數據方案
insertintouc_members(uid,username,password,salt)values(id,‘username’,md5(concat(md5(’password’),’123456′)),’123456’);
insertintocdb_members(uid,username,password,groupid)values(id,‘username’,md5(concat(md5(’password’),’123456′)),12);
insertintocdb_memberfields(uid,nickname)values(id,’username’);
其中:
id為max(uid)+10,uid本身在bbs、sns資料庫中是自增的,但為保證3個表數據uid的同步,因此由程式指定uid,而不是自增方式。
123456為salt值
例如:
insertintouc_members(uid,username,password,salt)values(203,’test5′,md5(concat(md5(’test5′),’123456′)),’123456′);
insertintocdb_members(uid,username,password,groupid)values(203,’test5′,md5(concat(md5(’test5′),’123456′)),12);
insertintocdb_memberfields(uid,nickname)values(203,’test5′);
採用此種方案簡單測試了一下,應該能夠自動完成用戶在BBS、Ucenterhome中的自動登錄,而且登錄bbs時候不需要用戶進行激活操作。先湊合用用,有空再完善相關功能。
4、表結構
*uc_members表結構:
CREATETABLE`uc_members`(
`uid`mediumint(8)unsignedNOTNULLAUTO_INCREMENT,
`username`char(15)NOTNULLDEFAULT”,
`password`char(32)NOTNULLDEFAULT”,
`email`char(32)NOTNULLDEFAULT”,
`myid`char(30)NOTNULLDEFAULT”,
`myidkey`char(16)NOTNULLDEFAULT”,
`regip`char(15)NOTNULLDEFAULT”,
`regdate`int(10)unsignedNOTNULLDEFAULT‘0′,
`lastloginip`int(10)NOTNULLDEFAULT‘0′,
`lastlogintime`int(10)unsignedNOTNULLDEFAULT‘0′,
`salt`char(6)NOTNULL,
PRIMARYKEY(`uid`),
UNIQUEKEY`username`(`username`)
)ENGINE=MyISAMAUTO_INCREMENT=194DEFAULTCHARSET=utf8
*cdb_members表結構:
CREATETABLE`cdb_members`(
`uid`mediumint(8)unsignedNOTNULLAUTO_INCREMENT,
`username`char(15)NOTNULLDEFAULT”,
`password`char(32)NOTNULLDEFAULT”,
`secques`char(8)NOTNULLDEFAULT”,
`gender`TINYINT(1)NOTNULLDEFAULT‘0′,
`adminid`tinyint(1)NOTNULLDEFAULT‘0′,
`groupid`SMALLINT(6)unsignedNOTNULLDEFAULT‘0′,
`groupexpiry`int(10)unsignedNOTNULLDEFAULT‘0′,
`extgroupids`char(20)NOTNULLDEFAULT”,
`regip`char(15)NOTNULLDEFAULT”,
`regdate`int(10)unsignedNOTNULLDEFAULT‘0′,
`lastip`char(15)NOTNULLDEFAULT”,
`lastvisit`int(10)unsignedNOTNULLDEFAULT‘0′,
`lastactivity`int(10)unsignedNOTNULLDEFAULT‘0′,
`lastpost`int(10)unsignedNOTNULLDEFAULT‘0′,
`posts`mediumint(8)unsignedNOTNULLDEFAULT‘0′,
`digestposts`smallint(6)unsignedNOTNULLDEFAULT‘0′,
`oltime`smallint(6)unsignedNOTNULLDEFAULT‘0′,
`Pageviews`mediumint(8)unsignedNOTNULLDEFAULT‘0′,
`credits`int(10)NOTNULLDEFAULT‘0′,
`extcredits1`int(10)NOTNULLDEFAULT‘0′,
`extcredits2`int(10)NOTNULLDEFAULT‘0′,
`extcredits3`int(10)NOTNULLDEFAULT‘0′,
`extcredits4`int(10)NOTNULLDEFAULT‘0′,
`extcredits5`int(10)NOTNULLDEFAULT‘0′,
`extcredits6`int(10)NOTNULLDEFAULT‘0′,
`extcredits7`int(10)NOTNULLDEFAULT‘0′,
`extcredits8`int(10)NOTNULLDEFAULT‘0′,
`email`char(40)NOTNULLDEFAULT”,
`bday`dateNOTNULLDEFAULT‘0000-00-00′,
`sigstatus`tinyint(1)NOTNULLDEFAULT‘0′,
`tpp`tinyint(3)unsignedNOTNULLDEFAULT‘0′,
`ppp`tinyint(3)unsignedNOTNULLDEFAULT‘0′,
`styleid`smallint(6)unsignedNOTNULLDEFAULT‘0′,
`dateformat`tinyint(1)NOTNULLDEFAULT‘0′,
`timeformat`tinyint(1)NOTNULLDEFAULT‘0′,
`pmsound`tinyint(1)NOTNULLDEFAULT‘0′,
`showemail`tinyint(1)NOTNULLDEFAULT‘0′,
`newsletter`tinyint(1)NOTNULLDEFAULT‘0′,
`invisible`tinyint(1)NOTNULLDEFAULT‘0′,
`timeoffset`char(4)NOTNULLDEFAULT”,
`newpm`tinyint(1)NOTNULLDEFAULT‘0′,
`accessmasks`tinyint(1)NOTNULLDEFAULT‘0′,
`editormode`tinyint(1)unsignedNOTNULLDEFAULT‘2′,
`customshow`tinyint(1)unsignedNOTNULLDEFAULT‘26′,
`xspacestatus`tinyint(1)NOTNULLDEFAULT‘0′,
`customaddfeed`tinyint(1)NOTNULLDEFAULT‘0′,
PRIMARYKEY(`uid`),
UNIQUEKEY`username`(`username`),
KEY`email`(`email`),
KEY`groupid`(`groupid`)
)ENGINE=MyISAMAUTO_INCREMENT=194DEFAULTCHARSET=utf8
*cdb_memberfields表結構
CREATETABLE`cdb_memberfields`(
`uid`mediumint(8)unsignedNOTNULLDEFAULT‘0′,
`nickname`varchar(30)NOTNULLDEFAULT”,
`site`varchar(75)NOTNULLDEFAULT”,
`alipay`varchar(50)NOTNULLDEFAULT”,
`icq`varchar(12)NOTNULLDEFAULT”,
`qq`varchar(12)NOTNULLDEFAULT”,
`yahoo`varchar(40)NOTNULLDEFAULT”,
`msn`varchar(40)NOTNULLDEFAULT”,
`taobao`varchar(40)NOTNULLDEFAULT”,
`location`varchar(30)NOTNULLDEFAULT”,
`customstatus`varchar(30)NOTNULLDEFAULT”,
`medals`textNOTNULL,
`avatar`varchar(255)NOTNULLDEFAULT”,
`avatarwidth`tinyint(3)unsignedNOTNULLDEFAULT‘0′,
`avatarheight`tinyint(3)unsignedNOTNULLDEFAULT‘0′,
`bio`textNOTNULL,
`sightml`textNOTNULL,
`ignorepm`textNOTNULL,
`groupterms`textNOTNULL,
`authstr`varchar(20)NOTNULLDEFAULT”,
`spacename`varchar(40)NOTNULL,
`buyercredit`smallint(6)NOTNULLDEFAULT‘0′,
`sellercredit`smallint(6)NOTNULLDEFAULT‘0′,
PRIMARYKEY(`uid`)
)ENGINE=MyISAMDEFAULTCHARSET=utf8
5、關於discuz的formhash問題的備註
從目前研究的結果來看,discuzbbs的formhash有兩種:登錄(註銷)的formhash和發帖(回帖)的formhash
獲取discuzbbs的formhash的方案如下(ucenterhome的有空再研究,應該與此類似):
在登入前,首先在未登錄狀態下訪問bbs登錄url地址以獲取登錄formhash,然後使用此formhash進行正常的登錄操作。
在發帖前,首先訪問發帖url地址以獲取發帖formahsh,然後使用此formhash進行正常的發帖操作。

相關詞條

熱門詞條

聯絡我們