2012-02-14 20 views
0

私はデータベースにパスワードを格納するためにBCryptの.Net実装を使用しています。パスワードは切り捨てられ、一部のユーザーのためにBCryptハッシュされたパスワードがデータベースで切り捨てられました

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

:パスワード欄には、VARCHAR(MAX)は

これは、ストアドプロシージャを経由してパスワードを更新するコードです。切り捨て後の例は次のとおりです。$ 2a $ 12 $ XM2

これは必ずしもそうではありません。

切り詰めの原因を理解するのを助けてください。

UPDATE:ここ

は、パスワードを更新するために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(); 
      } 

答えて

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

- 明示的に設定されていない場合は、サイズが指定されたパラメータ値の実際のサイズから推測されます。