Member 14766911 Ответов: 1

Проверка соленого и хэшированного пароля PBKDF2 в логине


Я следую примеру о том, как создать и проверить защищенный пароль с помощью PBKDF2, который я нашел из этого вебсайт

Что я уже пробовал:

Я создал класс под названием "HashCode", к которому я обращаюсь из формы регистрации и входа в систему, и я могу хэшировать и солить пароль во время регистрации пользователя, и он работает просто отлично.

Вот код, который хэширует и солит пароль:



class HashCode
{
    public string GetHashPassword(string password)
    {
        string hashPass = string.Empty;

        byte[] salt;
        new RNGCryptoServiceProvider().GetBytes(salt = new byte[20]);

        var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000);
        byte[] hash = pbkdf2.GetBytes(20);

        byte[] hashBytes = new byte[40];
        Array.Copy(salt, 0, hashBytes, 0, 20);
        Array.Copy(hash, 0, hashBytes, 20, 20);

        hashPass = Convert.ToBase64String(hashBytes);

        return hashPass;
    }


И вот как я вставляю его в базу данных:

command.Parameters.AddWithValue("@Password", hc.GetHashPassword(TxtBox_Password.Text));


Вот код, который проверяет пароль входа пользователя в систему:

public bool IsValidPassword(string password, string hashPass)
    {
        bool result = true;

        byte[] hashBytes = Convert.FromBase64String(hashPass);
        byte[] salt = new byte[20];
        Array.Copy(hashBytes, 0, salt, 0, 20);
        var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000);
        byte[] hash = pbkdf2.GetBytes(20);

        for (int i = 0; i < 20; i++)
        {
            if (hashBytes[i + 20] != hash[i])
            {
                throw new UnauthorizedAccessException();
            }
        }

        return result;
    }


А на моем Логинформе у меня есть:

command.Parameters.AddWithValue("@Password", hc.IsValidPassword(TxtBox_Password.Txt));


Но это не работает. Любая помощь была бы очень признательна!

phil.o

Пожалуйста, дайте определение "не работает".

Member 14766911

Я думаю, что "IsValidPassword" принимает два параметра (string password, string hashPass), и я не знаю, как добавить их в TextBox_Password.Text

F-ES Sitecore

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

Когда они создают свой пароль, вы получаете случайную соль и храните ее, а также

хэш(пароль + соль)

когда они пытаются войти в систему вы получаете соль которую использовали для хэширования их пароля и вы это делаете

хэш(loginPassword + usersSalt)

чтобы проверить, соответствует ли этот хэш тому, что хранится в базе данных.

1 Ответов

Рейтинг:
12

OriginalGriff

Не делай этого.
Вместо этого звоните hc.GetHashPassword при условии, что соли одинаковы - а если это не так, то вы никогда не получите хорошего соответствия или это жалкий метод засолки, - две строки Base64 должны быть одинаковыми.

Но... вам было бы лучше использовать "правильный" алгоритм хэширования, такой как SHA.
Это может помочь: Хранение паролей: как это сделать.[^]


Member 14766911

Я изменился:

команда.Параметры.AddWithValue("@Password", hc.IsValidPassword(TxtBox_Password.Txt));

К:

команда.Параметры.AddWithValue("@Password", hc.GetHashPassword(TxtBox_Password.Txt));

И я ввел правильный пароль, но теперь я получаю сообщение об ошибке msg, которое я устанавливаю, если Пароли не совпадают.

OriginalGriff

Прочтите, что я сказал!

Member 14766911

Проблема была в моем заявлении select.
Спасибо за помощь!