[原]ASP.NET中修改ServU FTP(ODBC,MySQL)密码

1. 为ServU FTP配置了ODBC数据源,后台数据库使用MySQL,配置方法不详述。

2. 在ASP.NET中,修改用户密码。

很简陋的页面,主要靠拖控件完成:

image

修改按钮的单击事件为:

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方法为检查用户名、原密码是否匹配:

/// <summary>
/// 检查用户名密码是否匹配
/// </summary>
/// <param name="user">用户名</param>
/// <param name="pass">密码</param>
/// <returns>匹配?</returns>
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为两个随机英文字母:

/// <summary>
/// 生成用于存储的ServU密码散列值
/// ServU密码规则:pass=a+b+MD5(a+b+pass),ab为随机英文字母
/// </summary>
/// <param name="pass">密码</param>
/// <returns>密码散列值</returns>
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数据库:

/// <summary>
/// 修改密码
/// </summary>
/// <param name="user">用户名</param>
/// <param name="oldPass">老密码</param>
/// <param name="newPass">新密码</param>
/// <returns>是否成功</returns>
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存储在数据库里的密码不是简单的数字密码散列值,在一定程度上增加了破解难度,但随机字母只有两个,且顺序固定,在前两位,也为暴力破解(包括字典)开了一小扇方便之门。总之强度不高。

posted @ 2010-05-27 09:08  littlelucky  阅读(482)  评论(0)    收藏  举报