MD5 хеш с солью для хранения пароля в БД в C # - PullRequest
18 голосов
/ 19 августа 2009

Не могли бы вы посоветовать мне простой алгоритм хеширования пароля пользователя с помощью MD5, но с salt для повышения надежности.

Теперь у меня есть этот:

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

Ответы [ 4 ]

40 голосов
/ 19 августа 2009

Вы можете использовать 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");
12 голосов
/ 19 августа 2009

Вот образец . Он обрабатывает MD5, SHA1, SHA256, SHA384 и SHA512.

3 голосов
/ 19 августа 2009

В дополнение к классу 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.

1 голос
/ 19 августа 2009

Microsoft сделала эту работу за вас, но для этого нужно немного покопаться. Установите расширения Web Service 3.0 и посмотрите на функцию Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest с помощью Reflector.

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

...