Как я могу проверить, что пароль правильный, если я добавлю случайную соль? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь защитить свое приложение на c #.Я знаю, что мы ДОЛЖНЫ хранить хэш и соль пароля в БД.Итак, мой вопрос: Как я могу сравнить этот пароль правильно, если я использую Случайную соль? (Случайная соль дает случайные значения каждый раз).У меня также есть код ниже

 public static string HashPassword(string p, string s)
    {
        var combinedPassword = String.Concat(p, s);
        var sha256 = new SHA512Managed();
        var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
        var hash = sha256.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    }

    public static String GetRandomSalt()
    {
        var random = new RNGCryptoServiceProvider();
        var salt = new Byte[1024];
        random.GetBytes(salt);
        return Convert.ToBase64String(salt);
    }

Я открыт для других предложений в целом.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я открыт для других предложений в целом.

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

Если вы делаете это "для защиты вашего приложения" , остановитесь сейчас.Существуют гораздо лучшие решения, такие как BCrypt, Scrypt и Argon, которые позаботятся обо всем этом для вас и защитят от угроз, которые большинство людей даже не рассматривали.Это, конечно, внутренняя соль (соли), поэтому понимание того, для чего они предназначены и как они работают, все еще является полезным делом.Приблизительно при том же объеме кода вы будете обрабатывать учетные данные намного более надежно, чем указывает опубликованный код.Поищите их для подробностей.

Если вы просто делаете это как "упражнение, чтобы понять, как все это работает" , продолжайте читать.

Так что же такоесоль и почему она полезна для защиты безопасности?

Соль - это дополнительная энтропия, которая не является частью пароля пользователя, а вместо этого известна или изобретена сервером во время хеширования пароляи хранится.Сгенерированная соль должна быть известна серверу при проверке вашего пароля.Есть много способов его хранения.Это может быть первый / последний / средний / каждый 8-й / любой из n символов хэша пароля, хранящегося в базе данных.Может иметь свое отдельное поле.Он может даже основываться на других неизменных фактах, таких как первичные ключи самой записи пользователя.

Модель угрозы, от которой это защищает, может быть описана следующим образом.Рассмотрим базу данных, которая была скомпрометирована и теперь содержится злоумышленником.Сложность заключается в том, что, если злоумышленник хранит учетные данные (в хешированном виде), можем ли мы помешать им угадать пароль пользователя (по крайней мере, не пытаясь использовать метод словарной атаки или атаки методом перебора).

Если вы думали, что хэшированиеРешив эту проблему, я приведу два возможных сценария:

1. Два пользователя могут использовать один и тот же пароль

Если пароль хеширован, но не засолен, то двапользователи, выбравшие один и тот же пароль, получат тот же хеш. И даже если пароль не «ужасный», другой пользователь может раскрыть ваш пароль, введя его как «Подсказка к паролю». Если пароли были засолены,тогда тот факт, что подсказка к паролю выдала пароль другого пользователя, не означает, что тот же пароль будет работать в вашей учетной записи.

2. Радужные таблицы

Если у вас есть достаточно времени и вычислительной мощности, вы можете сгенерировать (или загрузить) набор радужных таблиц. Это в основном пары ключ-значение, wздесь ключом является хеш, а значением является исходный пароль.Они генерируются в обратном порядке.То есть взять строку, хэшировать ее, добавить хеш в качестве ключа и исходную строку в качестве цели.Для поиска вы просто ищете ключ хеша и видите, какое значение возвращается.Рядом мгновенно.Однако при наличии достаточно длинной исходной строки она не будет предварительно вычислена, поэтому не попадет в радужную таблицу.Если я знаю соль, которую вы используете, и алгоритм хеширования, я все равно могу выполнить свою собственную атаку по словарю или атаку методом грубой силы, но внезапно я должен попробовать каждое предположение по очереди, пока мне не повезет, поэтому, если ваш пароль верен, яне найдет его в «разумное время».

Точный ответ на поставленный вопрос

Как я могу сравнить этот пароль, если я использую Случайную соль?

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

0 голосов
/ 23 января 2019

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

...