Skip to content

Discuz 用户密码加密算法

今天在拿Discuz进行二次开发时需要在代码里验证Discuz的用户名密码,结果不小心掉进了坑里,因为Discuz的论坛有两张表来存储用户数据,一张在Discuz的数据库ultrax里面的pre_common_member里面,另一个是存储在了UCenter的数据库ucenter的uc_members表里。花了很大功夫在研究ultrax库里那张pre_common_member的数据,研究它的密码是如何生成的,结果搜了一下发现网上说是随机生成的一个salt,心想这随机生成的salt如何在登录时进行验证呢?然后网上说其实Discuz压根就没用那个密码,自己试验了一下,果真如此,即使把pre_common_member里面的用户密码改掉,照样能够正常登录,看来这个密码压根就没用,害我绕了一个大圈子。

好了,进入正题,Discuz的密码加密算法其实就是两次MD5加密,首先用明文进行一次加密,之后随机生成一个salt,再把第一次的密文后面添加salt作为明文再进行一次MD5加密。salt保存在uc_members表里,可以通过用户名进行获取。

像这样:

MD5(MD5(明文)+salt)

下面是.net的实现代码:

string GetDiscuzPWString(string sourceStr, string salt)
{
 	return GetMd5Hash(string.Concat(GetMd5Hash(sourceStr),salt));
}

string GetMd5Hash(string input)
{
	MD5 md5Hasher = MD5.Create();

	byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

	StringBuilder sBuilder = new StringBuilder();

	for (int i = 0; i < data.Length; i++)
	{
		sBuilder.Append(data[i].ToString("x2"));
	}

	return sBuilder.ToString();
}
0 0 votes
Article Rating
5 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
我行我素

这个东西可以啊,还可以用第三方账号登陆啊,你的主页都挂广告了啊,可以赚钱嘛?

我行我素

看好你的个人微博 继续努力

妹子内涵图

网站不错很漂亮,欢迎互访!