Как подсолить и хэшировать значение пароля с помощью c #? - PullRequest
17 голосов
/ 05 января 2010

Хай, ребята,

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

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

  • Как сравнить значения, хранящиеся в БД, и значение, указанное пользователем?

Ответы [ 6 ]

21 голосов
/ 05 января 2010

Самый популярный способ сделать это - использовать алгоритм хеширования. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>

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

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

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

При входе в систему / проверке пользователя и пароля:

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

Это все относительно скучно, но очень безопасно.

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

5 голосов
/ 05 января 2010

Простой хеш:

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);
        }
0 голосов
/ 05 января 2010

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

Вот пример кода (с использованием 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 голосов
/ 05 января 2010
0 голосов
/ 05 января 2010

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

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

0 голосов
/ 05 января 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...