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#関数で使用されているパスワードのパラメーターの長さを確認してください...

最後に、両側をテーブルスキーマと同期する必要があります。


サンプルコード...

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 に答える