Парни Hai,
Я узнал то значение хэш-функции хранения пароля, безопасный от Предпочтительного метода Хранения Паролей В Базе данных...
Как посолить и хешировать значение пароля с помощью c#?
Как сравнить и значения, сохраненные в DB и один данный пользователем?
Самый популярный способ сделать это - использовать алгоритм хэширования. В блоге есть отличный пост о том, как использовать алгоритм MD5 для хэширования строки, но есть много других примеров в пространстве имён System.Cryptography
.
Что касается #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);
}
Строго говоря, чтобы избежать атаки по словарю, нужно посолить пароль , а затем хэшировать его. Для вычисления хэша можно использовать любую из реализаций абстрактного класса HashAlgorithm
в System.Cryptography
namespace для вычисления хэша - текущим лучшим выбором, вероятно, будет один из SHA-2 алгоритмов.
Храните хэш, а не пароль, и сравниваете значения хэша для аутентификации пользователя.
.Как и говорили другие, вариантов много.
Вот пример кода (использующего 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);
Для хэширования у вас есть несколько поддерживаемых алгоритмов в System.Security.Cryptography, для вашего удобства вы, вероятно, захотите выбрать хэш, основанный на SHA или что-то подобное.
Относительно сравнения: Вы не сравниваете значение БД и то, которое вам дал пользователь. Вы используете ту же самую функцию шифрования/хэширования, которую вы использовали для хранения пароля в БД, на этот раз с пользовательским вводом. Если результат равен хэшу в БД, то пароль был (вероятно) верен.
Цель состоит в том, чтобы никто, имеющий доступ к БД, не мог получить пароли открытым текстом и даже ваша программа не должна об этом знать (только та часть, которая принимает ввод пользователя, будет иметь его в течение короткого времени).
Ссылки (возможно, даже дубликаты):