0

我正在使用 BCrypt 的 .Net 实现将密码存储在数据库中。密码列是 VARCHAR(MAX)

这是通过存储过程更新密码的代码:

Update [User] 
Set [Password]= @NewPassword, 
ModifiedOn = GetDate(),
ModifiedBy = 'PasswordChanger'
Where [UserName] = @UserName

对于某些用户,密码会被截断。截断后的一个例子是:$2a$12$XM2

情况并非总是如此。

请帮助我了解可能导致截断的原因?

更新:

下面是调用 SP 更新密码的 C# 代码:

string HashedPassword;
int NumberOfRowsAffected;
try
            {
                Database jss = DatabaseFactory.CreateDatabase();
                HashedPassword = BCrypt.HashPassword(txtPassword.Text, BCrypt.GenerateSalt(12));
                NumberOfRowsAffected = jss.ExecuteNonQuery("procUpdatePassword", GetLogin(HttpContext.Current.User.Identity), HashedPassword);
                if (NumberOfRowsAffected > 0)
                    lblStatus.Text = "Password updated.";
                else
                {
                    lblStatus.Text = "Password not updated for this user.";
                }

            }
            catch (Exception ex)
            {
                lblStatus.Text = "Password was not changed due to an error.";
                lblStatus.Text += ex.ToString();
            }
4

1 回答 1

1
  1. 请检查您在存储过程中使用的密码的输入参数长度...
  2. 在调用发出数据库请求之前,请检查您在 C# 函数中使用的密码的参数长度...

最后,双方都应该与 Table 模式同步。


示例代码...

using (SqlConnection con = new SqlConnection("Your Connection String"))
{
    using (SqlCommand cmd = new SqlCommand("Your Stored Procedure Name", con))
    {
        SqlParameter param = new SqlParameter();
        param.ParameterName = "Parameter Name";
        param.Value = "Value";
        param.SqlDbType = SqlDbType.VarChar;
        param.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}

- 如果未明确设置,则从指定参数值的实际大小推断大小。

于 2012-02-14T17:13:19.223 回答