Логин Сравнение хеш-значения в базе данных - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь сделать простой знак на части приложения, которое я создаю.Чтобы подтвердить вход, я просто пытаюсь убедиться, что значение хэша введенного пароля совпадает с тем, которое хранится в моей локальной базе данных: App_Users ) '

ButtonClick:

        string AppUsername = textBox2.Text.ToString();
        string AppPassword = textBox1.Text.ToString();
        //- Hashed-V-
        byte[] salt;
        new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
        var pbkdf2 = new Rfc2898DeriveBytes(AppPassword, salt, 10000);
        byte[] hash = pbkdf2.GetBytes(20);
        byte[] hashBytes = new byte[36];
        Array.Copy(salt, 0, hashBytes, 0, 16);
        Array.Copy(hash, 0, hashBytes, 16, 20);
        string savedPasswordHash = Convert.ToBase64String(hashBytes);                                                                   //              <--  see ' /3751242/kak-heshirovat-parol ' for the part on comparing the recalculated 
        //-
        SqlConnection con = new SqlConnection();
        con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
        con.Open();                

        var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE (Hash = @Hash");
        cmd.Connection = con;
        savedPasswordHash = cmd.ExecuteScalar() as string;

        if (cmd.ExecuteNonQuery() > 0) {
            MessageBox.Show(" Query successful..something matched..  ");
            //change page.. load a profile? 
        }

Однако я получаю сообщение об ошибке:

 'Must declare the scalar variable "@Hash".'

Я искал вокруг, но я не уверен, что следующий шаг для именно того, что я пытаюсь сделать, это ..Извините, это, вероятно, плохой вопрос.Я думаю, это как-то связано с адаптером?

1 Ответ

0 голосов
/ 15 декабря 2018

Вы не передали значение для параметра @Hash в запросе.И вам также следует проверить имя пользователя в запросе, иначе попытка входа будет успешной, если любой логин использует заданный пароль.

Попробуйте что-то вроде:

...
var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE Hash = @Hash AND Username = @Username");
cmd.Connection = con;
cmd.Parameters.Add("@Hash", SqlDbType.VarChar, 48).Value = savedPasswordHash;
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 32).Value = AppUsername;

if (cmd.ExecuteNonQuery() > 0) {
...

Это предполагает, что App_Users.Hash является VARCHAR(48) и App_Users NVARCHAR(32).Возможно, вам придется изменить его в соответствии с типами данных, которые вы фактически используете.

...