Как посолить и хешировать значение пароля с помощью c#?

Парни Hai,

Я узнал то значение хэш-функции хранения пароля, безопасный от Предпочтительного метода Хранения Паролей В Базе данных...

  • Как посолить и хешировать значение пароля с помощью c#?

  • Как сравнить и значения, сохраненные в DB и один данный пользователем?

17
задан Community 23 May 2017 в 12:01
поделиться

6 ответов

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

Что касается #2, то общее пошаговое руководство о том, как это будет работать, будет выглядеть следующим образом:

При регистрации:

  1. Хэшируйте пароль пользователя, используя указанный вами алгоритм, и храните его в базе данных
  2. Salt этот хэш (опционально, но предпочтительно)

При проверке логина/пользователя и пароля:

  1. Ищите в базе данных имя пользователя
  2. Если оно существует, найдите хэш-пароль
  3. Хэш и соль введенного пароля и сравните его с найденным паролем

Все это относительно длинноволновое, но очень надежное.

Есть еще одно чрезвычайно подробное руководство по хэшированию и посоливанию здесь .

.
21
ответ дан 30 November 2019 в 13:13
поделиться

Простой хэш:

public string GetSHA256Hash(string s)
        {
            if (string.IsNullOrEmpty(s))
            {
                throw new ArgumentException("An empty string value cannot be hashed.");
            }

            Byte[] data = System.Text.Encoding.UTF8.GetBytes(s);
            Byte[] hash = new SHA256CryptoServiceProvider().ComputeHash(data);
            return Convert.ToBase64String(hash);
        }
5
ответ дан 30 November 2019 в 13:13
поделиться

Строго говоря, чтобы избежать атаки по словарю, нужно посолить пароль , а затем хэшировать его. Для вычисления хэша можно использовать любую из реализаций абстрактного класса HashAlgorithm в System.Cryptography namespace для вычисления хэша - текущим лучшим выбором, вероятно, будет один из SHA-2 алгоритмов.

Храните хэш, а не пароль, и сравниваете значения хэша для аутентификации пользователя.

.
0
ответ дан 30 November 2019 в 13:13
поделиться

Как и говорили другие, вариантов много.

Вот пример кода (использующего MD5 вместо SHA) из Microsoft, который может помочь начать

   using System;
   using System.Security.Cryptography;
   using System.Text;

   string sSourceData;
   byte[] tmpSource;
   byte[] tmpHash;

   sSourceData = "MySourceData";
   //Create a byte array from source data.
   tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

   //Compute hash based on source data.
   tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
0
ответ дан 30 November 2019 в 13:13
поделиться

Для хэширования у вас есть несколько поддерживаемых алгоритмов в System.Security.Cryptography, для вашего удобства вы, вероятно, захотите выбрать хэш, основанный на SHA или что-то подобное.

Относительно сравнения: Вы не сравниваете значение БД и то, которое вам дал пользователь. Вы используете ту же самую функцию шифрования/хэширования, которую вы использовали для хранения пароля в БД, на этот раз с пользовательским вводом. Если результат равен хэшу в БД, то пароль был (вероятно) верен.

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

Ссылки (возможно, даже дубликаты):

0
ответ дан 30 November 2019 в 13:13
поделиться
-1
ответ дан 30 November 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: