Подтвердить что ты не робот

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

Парни Хай,

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Простой хеш:

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);
        }

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Вот пример кода (используя 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);