康盛的系列产品,包括 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 是个简便的方法。