2012-02-14 103 views
0

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

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

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

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

这并非总是如此。

请帮我理解什么可能导致截断?

UPDATE:

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

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(); 
      } 

回答

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

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


示例代码...

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(); 
    } 
} 

注意 - 如果没有明确设定,大小从指定的参数值的实际大小推断。