|
1. 为ServU FTP配置了ODBC数据源,后台数据库使用MySQL,配置方法不详述。
2. 在ASP.NET中,修改用户密码。
很简陋的页面,主要靠拖控件完成:
修改按钮的单击事件为:
protected void ButtonChangePass_Click(object sender, EventArgs e)
{
string user = TextBoxUsername.Text;//用户名
string oldPass = TextBoxPrePass.Text;//原密码
string newPass = TextBoxNewPass.Text;//新密码
string newPassRe = TextBoxReNewPass.Text;//重复新密码
string resultText = "";
divResult.Visible = true;
if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(oldPass) && !string.IsNullOrEmpty(newPass) && !string.IsNullOrEmpty(newPassRe) && newPass == newPassRe)
{
if (CheckPassByUser(user, oldPass))
{
if (ChangePass(user, oldPass, newPass)) resultText = "修改成功!请重新登录!";
else resultText = "修改失败,请重试!";
}
else resultText = "用户名或密码错误!请重试!";
}
else resultText = "输入错误,请重试!";
LabelResult.Text = resultText;
}
其中引用到的CheckPassByUser方法为检查用户名、原密码是否匹配:
///
/// 检查用户名密码是否匹配
///
/// 用户名
/// 密码
/// 匹配?
private bool CheckPassByUser(string user, string pass)
{
string txtSQL = string.Format("SELECT PASSWORD FROM servudb.useraccounts WHERE NAME='{0}'", user);
object o = MySQLHelper.GetSingle(txtSQL);
if (o != null)
{
string dbPass = (string)o;
if (dbPass.Length > 32)
{
char a, b;
a = dbPass[0];
b = dbPass[1];
string password = string.Format("{0}{1}{2}", a, b, pass);
password = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");
password = string.Format("{0}{1}{2}", a, b, password.ToUpper());
if (dbPass == password) return true;
}
}
return false;
}
GenNewPass生成数据库中存储的密码散列值,ServU默认的散列算法为pass=a+b+MD5(a+b+pass),其中a、b为两个随机英文字母:
///
/// 生成用于存储的ServU密码散列值
/// ServU密码规则:pass=a+b+MD5(a+b+pass),ab为随机英文字母
///
/// 密码
/// 密码散列值
private string GenNewPass(string pass)
{
Random rnm = new Random();
char a = (char)(rnm.Next(97, 123));//随机字母a
char b = (char)(rnm.Next(97, 123));//随机字母b
string password = string.Format("{0}{1}{2}", a, b, pass);
password = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");
password = string.Format("{0}{1}{2}", a, b, password.ToUpper());
return password;
}
修改密码操作就很简单了,直接update数据库:
///
/// 修改密码
///
/// 用户名
/// 老密码
/// 新密码
/// 是否成功
private bool ChangePass(string user, string oldPass, string newPass)
{
string txtSQL = string.Format("UPDATE servudb.useraccounts SET PASSWORD = '{0}' WHERE NAME = '{1}';", GenNewPass(newPass), user);
if (MySQLHelper.ExecuteSql(txtSQL) > 0) return true;
return false;
}
3. 测试,成功!
4. 关于ServU的默认密码算法
MD5散列,应该还是安全的,虽然现在有专门的MD5查询网站(原来免费的,现在发展会员,开始收费了)…即是用户使用纯数字密码,经处理,实际变成了字母数字混合的密码,且ServU存储在数据库里的密码不是简单的数字密码散列值,在一定程度上增加了破解难度,但随机字母只有两个,且顺序固定,在前两位,也为暴力破解(包括字典)开了一小扇方便之门。总之强度不高。 |
|
|