尝试更新散列密码 c#
Trying to update hashed password c#
我正在尝试使用更改密码表单在 asp.net 上使用新的散列密码更新我的数据库,但它不起作用,也没有给我错误。
我正在为 hashing.Registration 使用 bcrypt 并且登录工作正常,但更改散列密码很困难。
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString);
con.Open();
//Select
string query = "select password from Users where name=@name";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@password", txtOld.Text.Trim());
cmd.Parameters.AddWithValue("@name", LblUser.Text);
//Update
try {
string queryupdate = "UPDATE Users SET password=@newpassword WHERE name=@name";
SqlCommand cmd1 = new SqlCommand(queryupdate, con);
string salt = BCr.BCrypt.GenerateSalt(12);
// if you look at the hashed password, notice that it's prepended with the salt generated above
string hashedPassword = BCr.BCrypt.HashPassword(txtConfirm.Text.Trim(), salt);
cmd1.Parameters.AddWithValue("@name", LblUser.Text);
cmd1.Parameters.AddWithValue("@newpassword", hashedPassword);
cmd1.Parameters.AddWithValue("@password", txtOld.Text.Trim());
cmd1.ExecuteNonQuery();
LblUser.Text = "Password changed successfully";
LblUser.ForeColor = System.Drawing.Color.Green;
}
catch(Exception ex)
{
LblUser.Text = "Something Went Wrong";
LblUser.ForeColor = System.Drawing.Color.Red;
}
我假设您使用的是更新版本的 bcrypt 库 https://www.nuget.org/packages/BCrypt.Net-Next/ 而不是有错误的旧版本。
首先不要自己生成盐,这是在库中处理的。
您只需调用
即可安全地生成新密码哈希
var myNewHash = BCrypt.ValidateAndReplacePassword(currentPassword, currentHash, newPassword);
这当然会强制要求用户输入当前密码才能更改密码(这是最佳做法)。
如果您在密码重置的意义上这样做,您应该使用
散列密码
var myNewHash = BCrypt.HashPassword("newpassword");
如自述文件开头所述https://github.com/BcryptNet/bcrypt.net
至于SQL元素;我会考虑使用 EF 或 Dapper.Net 而不是直接 ADO 操作。 SQL 参数化不是针对 SQLI Examples of SQL injection even when using SQLParameter in .NET?
的万无一失的保护
如果您使用的是 ADO,请确保指定参数类型 ala
var connect = ConfigurationManager.ConnectionStrings["NorthWind"].ToString();
var query = "Select * From Products Where ProductID = @ProductID";
using (var conn = new SqlConnection(connect))
{
using (var cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@ProductID", SqlDbType.Int);
cmd.Parameters["@ProductID"].Value = Convert.ToInt32(Request["ProductID"]);
conn.Open();
conn.Open();
//Process results
}
}
免责声明:我是所列存储库的作者
来自 https://www.mikesdotnetting.com/article/113/preventing-sql-injection-in-asp-net
的 ADO 代码示例
我正在尝试使用更改密码表单在 asp.net 上使用新的散列密码更新我的数据库,但它不起作用,也没有给我错误。
我正在为 hashing.Registration 使用 bcrypt 并且登录工作正常,但更改散列密码很困难。
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString);
con.Open();
//Select
string query = "select password from Users where name=@name";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@password", txtOld.Text.Trim());
cmd.Parameters.AddWithValue("@name", LblUser.Text);
//Update
try {
string queryupdate = "UPDATE Users SET password=@newpassword WHERE name=@name";
SqlCommand cmd1 = new SqlCommand(queryupdate, con);
string salt = BCr.BCrypt.GenerateSalt(12);
// if you look at the hashed password, notice that it's prepended with the salt generated above
string hashedPassword = BCr.BCrypt.HashPassword(txtConfirm.Text.Trim(), salt);
cmd1.Parameters.AddWithValue("@name", LblUser.Text);
cmd1.Parameters.AddWithValue("@newpassword", hashedPassword);
cmd1.Parameters.AddWithValue("@password", txtOld.Text.Trim());
cmd1.ExecuteNonQuery();
LblUser.Text = "Password changed successfully";
LblUser.ForeColor = System.Drawing.Color.Green;
}
catch(Exception ex)
{
LblUser.Text = "Something Went Wrong";
LblUser.ForeColor = System.Drawing.Color.Red;
}
我假设您使用的是更新版本的 bcrypt 库 https://www.nuget.org/packages/BCrypt.Net-Next/ 而不是有错误的旧版本。
首先不要自己生成盐,这是在库中处理的。
您只需调用
即可安全地生成新密码哈希var myNewHash = BCrypt.ValidateAndReplacePassword(currentPassword, currentHash, newPassword);
这当然会强制要求用户输入当前密码才能更改密码(这是最佳做法)。
如果您在密码重置的意义上这样做,您应该使用
散列密码var myNewHash = BCrypt.HashPassword("newpassword");
如自述文件开头所述https://github.com/BcryptNet/bcrypt.net
至于SQL元素;我会考虑使用 EF 或 Dapper.Net 而不是直接 ADO 操作。 SQL 参数化不是针对 SQLI Examples of SQL injection even when using SQLParameter in .NET?
的万无一失的保护如果您使用的是 ADO,请确保指定参数类型 ala
var connect = ConfigurationManager.ConnectionStrings["NorthWind"].ToString();
var query = "Select * From Products Where ProductID = @ProductID";
using (var conn = new SqlConnection(connect))
{
using (var cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@ProductID", SqlDbType.Int);
cmd.Parameters["@ProductID"].Value = Convert.ToInt32(Request["ProductID"]);
conn.Open();
conn.Open();
//Process results
}
}
免责声明:我是所列存储库的作者
来自 https://www.mikesdotnetting.com/article/113/preventing-sql-injection-in-asp-net
的 ADO 代码示例