Как соль и хэш значение пароля с помощью С#?
Парни Хай,
Я узнал, что сохранение хэш-значения пароля является безопасным с Предпочтительным методом хранения паролей в базе данных...
-
Как солить и изменить значение пароля с помощью С#?
-
Как сравнить как значения, хранящиеся в БД, так и данные, заданные пользователем?
Ответы
Ответ 1
Самый популярный способ сделать это - использовать алгоритм хеширования. Там отличный сообщение в блоге здесь о том, как использовать алгоритм MD5 для хеширования строки, но есть много других примеров в пространстве имен System.Cryptography
.
Что касается # 2, общее пошаговое руководство о том, как это будет работать, будет следующим:
При регистрации:
- Хешируйте пароль пользователя, используя указанный вами алгоритм, и сохраните его в базе данных.
- Соль этот хеш (необязательно, но предпочтительнее)
При входе в систему/проверке пользователя и пароля:
- Ищите в базе данных имя пользователя
- Если он существует, восстановите хешированный пароль
- Взломайте и введите введенный пароль и сравните его с восстановленным паролем.
Это все относительно скучно, но это очень безопасно.
Там еще один очень подробное руководство по хэширования и соления здесь.
Ответ 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);
Ответ 6
System.Security.Cryptography.MD5