我有这个代码用于登录我的系统。有这个功能,我可以随时更改我的密码。但问题是,一旦我的密码被更改,我就不知道在这段代码中要改变什么,以便我可以在登录时使用它。
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.");
}
}
答案 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
}
代码只是伪造的,肉应该由你自己添加。您的代码还有两个问题:
/!\ 也是一件值得注意的重要事项; 不关心这些东西会让你的公司和你个人遇到严重的法律纠纷
编辑:基于评论的一些更正,所以有些评论不再那么有意义了......感谢Panagiotis Kanavos
答案 1 :(得分:0)
(password.Text == "administrator")
这始终与管理员核实
(存储在Db中的password.Text=="Data"
与该用户相关“)
你必须这样做。