【问题标题】:validating and changing a user's password验证和更改用户密码
【发布时间】:2011-09-24 18:46:45
【问题描述】:

我有一个简单的 C# windows 窗体,它用作登录,但也有一个用于更改用户密码的窗体。

当您点击更改密码时,表单会加载一个包含当前密码、新密码和确认新密码的文本框,以及一个保存按钮。

我已将用户名存储在标签中,以便可以检查当前密码是否在数据库中有效。

我将这些存储在我在 Microsoft SQL Server 2008 中创建的表中。

目前代码如下。

SqlConnection connect = new SqlConnection(str); 
connect.Open(); 
string username = label_username.Text; 
string password = textBox_Current.Text; 
string newPassword = textBox_New.Text; 
string confirmPassword = textBox_Verify.Text; 
string sqlquery = "UPDATE [Member] SET Password=@newpass where Username=@username"; 
SqlCommand cmd = new SqlCommand(sqlquery, connect); 
cmd.Parameters.AddWithValue("@newpass", textBox_Verify.Text);   
cmd.Parameters.AddWithValue("@username", label_username.Text);   
cmd.Parameters.AddWithValue("@password", textBox_Current.Text); 
cmd.Connection = connect; 
cmd.ExecuteNonQuery(); 
sqlDataReader reader = null; 
reader = cmd.ExecuteReader(); 
while (reader.Read())
 { 
if ((textBox_New.Text == reader["newPassword"].ToString()) & (textBox_Verify.Text == (reader["confirmPassword"].ToString()))) { } 
}
 MessageBox.Show("Password Changed Successfully!"); 
this.Close();

在执行上述代码时,密码更改但我想:

  • 检查验证,就像用户在当前密码中输入了错误的密码一样。
  • 新密码并确认密码。
  • 当用户点击第一次保存底部空白密码时,不应存储在数据库中,而应给出消息“请输入密码”

如何做到这一点?

【问题讨论】:

  • 不要以纯文本形式存储密码。相反,请使用安全哈希。
  • 您肯定在对这些密码进行哈希处理,而且您只是为了我们的利益而对其进行了简化,对吧?对吧!?
  • 我建议只使用会员身份验证,附带 API 和一切,无需重新发明轮子
  • 我强烈建议您的查询不要基于用户名本身,而是使用某种类型的用户 ID。否则请确保给定的用户名只能使用一次...

标签: c# winforms passwords


【解决方案1】:
   protected void btn_PasswordChange(object sender, EventArgs e)
    {
        string constring = DataAccess.GetConnection();
        SqlConnection con = new `SqlConnection`(constring);

        {
            if (con.State != ConnectionState.Open)
                con.Open();
        }
        string str = "select * from tbl_MemberLogin where Password='" + txtoldpwd.Text + "'";
        DataTable DT = new DataTable();
        DT = objdut.GetDataTable(str);
        if (DT.Rows.Count == 0)
        {
            lblmsg.Text = "Invalid current password";
            lblmsg.ForeColor = System.Drawing.Color.Red;
        }
        else
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "update tbl_MemberLogin set Password='" + txtnewpwd.Text + "' where UserName='" + Session["UserName"].ToString() + "'";
            cmd.ExecuteNonQuery();
            lblmsg.Text = "Password changed successfully";
            lblmsg.ForeColor = System.Drawing.Color.Green;
        }
    }

【讨论】:

  • 请在您的代码中添加一些上下文。仅代码答案不能解释您所做的事情,因此不能作为答案。
【解决方案2】:

首先你应该在你的应用程序中使用密码散列,因此数据库的密码字段应该包含散列值。

假设这一点,为了实现你的目标,

  1. 考虑你的字符串用户名 -> 散列它 -> 写一个查询来检查这个散列值和存储在数据库中的用户密码的散列值是否相同
  2. 在你的代码中考虑字符串密码和字符串newPassword -> 哈希两者 -> 检查哈希值是否相同
  3. 考虑字符串密码和字符串newPassword -> 检查每个是否为空或长度为0

您还应该按以下顺序执行这些任务:

1 -> 3 -> 2

希望这会有所帮助...

【讨论】:

    【解决方案3】:

    您真的不应该以纯文本形式存储这些密码。您应该散列密码并存储散列。然后,如果您想检查密码是否正确,请对用户输入的密码进行哈希处理,并将其与为用户存储的哈希值进行比较。

    但是,听起来您需要帮助从数据库中为当前用户获取值。把这样的东西放在那里,应该为你做这个。请注意,就像我上面所说的,这实际上应该是检索密码的哈希值,而不是纯文本的实际密码。

    string sqlquery = "SELECT Password FROM [Member] where Username=@username";
    SqlCommand cmd = new SqlCommand(sqlquery, connect);
    cmd.Parameters.AddWithValue("@username", label_username.Text);
    cmd.Connection = connect; 
    string currentPassword = (string)cmd.ExecuteScalar();
    
    if (currentPassword == textBox_Current.Text)
    {
     // PASSWORD IS CORRECT, CHANGE IT, NOW.
    } else {
     // WOW EASY BUDDY, NOT SO FAST
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2014-02-03
      • 2018-05-26
      相关资源
      最近更新 更多