如果你有更改密码怎么用?

时间:2017-08-31 04:40:08

标签: c# wpf

我有这个代码用于登录我的系统。有这个功能,我可以随时更改我的密码。但问题是,一旦我的密码被更改,我就不知道在这段代码中要改变什么,以便我可以在登录时使用它。

private void Button_Click(object sender, RoutedEventArgs e)
{

    if((usrnm.Text == "Administrator") && (password.Text == "administrator"))
    {
        MainWindow main = new MainWindow();
        main.Show();
        this.Hide();
    }
    else
    {
        MessageBox.Show("Username or Password is Incorrect.");
    }
}

而且,每当我更改它时,它都会说"密码已被更改"但它在数据库中没有变化。

private void btn_save_Click(object sender, RoutedEventArgs e)
{

    if (opw.Text == "administrator")
    {
        if (npw.Text == cpw.Text)
        {
            OpenDbase("Update USER set Password '" + this.npw.Text + "'");
            DataTable dtable = new DataTable();
            MessageBox.Show("Password has been changed.");
        }
        else
        {
            MessageBox.Show("Npw and Cpw mismatched.");
        }
    }
    else 
    {
        MessageBox.Show("Opw was Incorrect.");
    }
}

2 个答案:

答案 0 :(得分:0)

您的登录代码问题是,它始终将登录密码与固定字符串“administrator”进行比较,而不考虑用户将密码更改为什么。在比较任何内容之前,您需要获取当前用户的密码。这反过来意味着您的数据库需要具有密码的默认值。

如果您想支持多个用户,那么这些内容将起作用

private void Button_Click(object sender, RoutedEventArgs e)
{
    if(CheckPassword(usrnm.Text, password.Text))
    {
        MainWindow main = new MainWindow();
        main.Show();
        this.Hide();
    }
    else
    {
        MessageBox.Show("Username or Password is Incorrect.");
    }
}

private void btn_save_Click(object sender, RoutedEventArgs e)
{       
    if (CheckPassword(<usrnm.Text?>, opw.Text))
    {
        if (npw.Text == cpw.Text)
        {
            var salt = //Generate random string for salt
            OpenDbase("Update USER set Salt '" + salt + "'");
            OpenDbase("Update USER set Password '" + Hash(this.npw.Text, salt) + "'");
            DataTable dtable = new DataTable();
            MessageBox.Show("Password has been changed.");
        }
        else
        {
            MessageBox.Show("Npw and Cpw mismatched.");
        }
    }
    else 
    {
        MessageBox.Show("Opw was Incorrect.");
    }
}

private bool CheckPassword(string user, string password){
    // Get Password hash & salt out of database
    var passwd = OpenDbase("SELECT Password FROM <???> WHERE USER=user");
    var salt = OpenDbase("SELECT Salt FROM <???> WHERE USER=user");

    if(/*No results found, i.e. user not in db*/){
        return false;
    } else {
        return passwd == Hash(password, salt);
    }
}

private string Hash(string text, string salt){
    // Apply e.g. SHA256 to the string and return the result
}

代码只是伪造的,肉应该由你自己添加。您的代码还有两个问题:

  1. 切勿在任何地方存储明文密码。使用哈希与盐。我已经在正确的位置编写了一个虚拟哈希函数。阅读它!它可以防止恶意窃贼在窃取您客户的数据时拥有所有密码。单独散列将使您的密码不可读,盐析将阻止使用包含预先计算的散列值的所谓彩虹表进行轻松搜索。此外,永远不要自己编写哈希函数。使用框架已经为您提供的内容。再次,阅读Hashing&amp;盐渍,一些更多信息在评论中。如果它是私人项目, 重要,但仍然......请...
  2. 您应该绝对参数化您的查询。猜猜如果有人写“abc'; DROP USERS;”会发生什么?作为他的新密码?是的,它搞砸了你的数据库。你不希望这样。使用参数化查询(如果可用),它们将为您处理有问题的值。
  3. /!\ 也是一件值得注意的重要事项; 不关心这些东西会让你的公司和你个人遇到严重的法律纠纷

    编辑:基于评论的一些更正,所以有些评论不再那么有意义了......感谢Panagiotis Kanavos

答案 1 :(得分:0)

(password.Text == "administrator")

这始终与管理员核实

(存储在Db中的password.Text=="Data"与该用户相关“)

你必须这样做。