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

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

Ответ 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.

Я хотел бы опубликовать исходный код этой функции здесь, но я не уверен, законно ли это сделать. Если кто-нибудь может успокоить меня, я сделаю это.