康盛的系列產品,包括 Discuz 、 UCHome 、 Supesite 都集成了同一個用户系統——UCenter,用户登錄的密碼也保存在
UCenter 中,對於其他系統集成或導出數據到 UCenter 系統,通常會遇到密碼生成的問題,這裏就討論一下 UCenter 的用户密碼算法規則和生成
方法。

  密碼通常使用 MD5 對用户密碼 HASH
後保存在數據庫中的方法,如果黑客拿到了這個 HASH 數值,那麼可以採用字典的方式暴力破解,如果這個字典數據庫足夠大,並且字典比較符合人們的設置習慣
的話,那很容易就能破解常見的密碼,因此 UCenter 採用了 salt 來防止這種暴力破解,salt 是一隨機字符串,它與口令連接在一起,再用單向函數對
其運算,然後將 salt 值各單向函數運算的結果存入數據庫中。如果可能的 salt 值的數目足夠大的話,它實際上就消除了對常用口令採用的字典式攻擊,因為
黑客不可能在數據庫中存儲那麼多 salt 和用户密碼組合後的 HASH 值。

  UCenter 的創始人密碼是保存在文件中的,打開 uc 下面
/data/config.inc.php 文件,裏面的 UC_FOUNDERPW 保存的就是密碼,而 UC_FOUNDERSALT 保存的是 SALT 數值,
創始人密碼的創建規則是:UC_FOUNDERPW=md5(md5(PASSWORD).UC_FOUNDERSALT),就是先將密碼 MD5,然後添
加 salt,然後再次 MD5,產生的 HASH 數值保存在 config.inc.php 文件中,因此修改 UC_FOUNDERPW 裏面的數值就可以修改
UCenter 的創始人密碼。

  UCenter 的用户信息是保存在 uc_members 表中,在這個表中,每個用户都有一個不同的隨機
salt 字段,表中的 password 字段為計算後的密碼,密碼計算規則是 $password=md5(md5($password).$salt),也
就是將用户的密碼 MD5 後,添加 salt,然後再 MD5,保存在 password 字段中。

  因此,如果進行不同系統的數據轉換,可以根據
這個原理,將其他系統的用户名和密碼計算後,導入 UCenter 的 uc_members 表中,實現用户的遷移。例如,如果原有系統使用的是
md5(password) 這樣的算法保存密碼,那就通過程序隨機生成 salt,然後計算兩者累加後的 md5,這樣就很容易計算出這個用户在
UCenter 中的用户密碼 HASH 值,從而實現用户的無縫遷移。

  不過,如果原有系統使用的是 md5(password+salt) 的
方式保存的密碼,那就無法實現密碼的平滑遷移 UCenter 了,即使遷移,也只能人為將其 UCenter 的 password 增加一個 salt 才能使用,因
此,我們在平時設計系統用户密碼的時候,應該儘量採用 md5(md5(password)+salt) 的方式保存密碼,這樣才能方便的實現和
UCenter 的接口,並且保證了安全性,通常對於英文用户名來説,自建系統使用 username 來做 salt 是個簡便的方法。