MD5 хэш с солью для хранения пароля в БД в С#
Не могли бы вы посоветовать мне простой алгоритм для хэширования пароля пользователя с помощью MD5, но с солью для повышения надежности.
Теперь у меня есть это:
private static string GenerateHash(string value)
{
var data = System.Text.Encoding.ASCII.GetBytes(value);
data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
return Convert.ToBase64String(data);
}
Ответы
Ответ 1
Вы можете использовать класс HMACMD5:
var hmacMD5 = new HMACMD5(salt);
var saltedHash = hmacMD5.ComputeHash(password);
Работает с SHA-1, SHA256, SHA384, SHA512 и RIPEMD160:
var hmacSHA1 = new HMACSHA1(salt);
var saltedHash = hmacSHA1.ComputeHash(password);
Оба salt
и password
ожидаются как массивы байтов.
Если у вас есть строки, вам придется сначала преобразовать их в байты:
var salt = System.Text.Encoding.UTF8.GetBytes("my salt");
var password = System.Text.Encoding.UTF8.GetBytes("my password");
Ответ 2
Здесь sample. Он обрабатывает MD5, SHA1, SHA256, SHA384 и SHA512.
Ответ 3
В дополнение к классу HMACSHA1, упомянутому выше, если вам просто нужен быстрый соленый хеш, то вы уже на 95% от него:
private static string GenerateHash(string value, string salt)
{
byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value);
data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
return Convert.ToBase64String(data);
}
Настоящий трюк заключается в хранении соли в безопасном месте, например, в файле machine.config.
Ответ 4
Microsoft выполнила эту работу для вас, но для этого требуется немного копания. Установите расширения веб-служб 3.0 и посмотрите на функцию Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest
с помощью Reflector.
Я хотел бы опубликовать исходный код этой функции здесь, но я не уверен, законно ли это сделать. Если кто-нибудь может успокоить меня, я сделаю это.