今天朋友找我,說有一個論壇和網站,一年多前網站的製做者不曾實現Dicuz!NT同步功能,問題遺留至今。兩年前我曾利用c#
DiscuzTookit開發包,實現網站和論壇登陸同步、註冊同步、修改資料同步、修改密碼同步、註銷登陸同步等。今天看了他們的論壇,發現以前有過同步的痕跡,當時開發者,採用網站註冊時,向論壇數據表插入記錄的方式,目前,它只實現了註冊同步。接下來,就簡單些吧,也不想在現有的基礎上大動干戈,因而想了下,接着以前他們未完成的部分,Go On!跨域
首先,應該注意Cookie的跨域問題,這裏就不作詳細說明,我在其它博客裏,發表過這樣的問題,論壇跨域,咱們須要在管理後臺,設置下Cookie的域,如:原來:bbs.xxx.com,修改成: .xxx.com。這樣在同一個主域名下,能夠實現Cookie的跨域訪問問題。咱們在論壇後臺 全局->常規選項->基本設置 中,作以下修改便可:瀏覽器
咱們在登陸論壇後,用瀏覽器查看Cookie信息,其中有一項Cookie名爲dnt的,咱們來查看下信息:網站
在這裏,咱們注意到,Cookie信息中,包括了用戶id,用戶加密過的密碼和其它相關信息。這裏咱們主要探討密碼的加密方式。加密
Discuz!nt Cookie中密碼的加密方式採用的是md5和des雙重加密方式。對用戶輸入的密碼進行md5加密不是什麼難事,在這裏咱們須要注意的是,des的加密方式。des是Discuz!nt項目中Discuz.Common庫中 Discuz.Common.DES類中的加密方法。而 密碼利用Discuz.Common.DES加密時,採用的密碼加密key,須要和配置文件中的信息保持一致。關於密碼加密的key,咱們能夠在論壇根目錄下config文件夾中general.config文件,其中有一個<Passwordkey>的配置節,咱們就利用這個key,經過DES類中Encode方法對密碼進行加密。咱們來看看具體的代碼:code
Test case: /// <summary> /// 畫面載入事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { //密碼加密Key位於/config目錄的general.config文件。找到<Passwordkey>DFX00BDLBL</Passwordkey> const string PASSWORD_KEY = "DFX00BDLBL"; //原始密碼 string strPwd = "19900909asd"; //MD5加密後 string strMd5 = Discuz.Common.Utils.MD5(strPwd); string strDES = Discuz.Common.DES.Encode(strMd5, PASSWORD_KEY).Replace("[", "+"); //Cookie userid=104659&password=Mk0SVJLRcwFo/z7KsQgB0hVRBCcJ9uOaPqX+cQEgm4sz/0UBgWxV5A==&tpp=0&ppp=0&pmsound=1&invisible=0&referer=index.aspx&sigstatus=1&expires=43200 string strCookie = "Mk0SVJLRcwFo/z7KsQgB0hVRBCcJ9uOaPqX+cQEgm4sz/0UBgWxV5A=="; if (strDES == strCookie) { Response.Write("OK!"); } }
上面的代碼引用了Discuz.Common類庫中的方法。Discuz.Common.dll能夠在bbs的bin目錄中找到。 咱們把剛纔在Cookie中獲取到的密碼信息提取出來,與咱們加密後的密碼,進行比較。這樣咱們得出如下結論:事件
Discuz!nt中用戶登陸Cookie中密碼的加密方式是先經過Md5加密後,再經過Discuz.Common.DES中的Encode方法結合md5
Passwordkey進行加密,從上面代碼的運行結果咱們能夠看出,加密後的結果,和Cookie中的密碼徹底一致。