2009-08-19 4 views
18

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

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

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

Зачем использовать сломанный хеш, как MD5? Как минимум используйте что-то вроде SHA-256. –

+6

Ну, почему НЕ использовать MD5? Использование соли разумно смягчает уязвимость из-за отсутствия сопротивления MD5, нет? –

+1

@Greg, не могли бы вы привести пример использования с солью, если это применимо? – abatishchev

ответ

40

Вы можете использовать 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"); 
+1

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.hmacsha1.aspx Конструктор HMACSHA1 принимает не соль, а ключ как единственный параметр – abatishchev

+4

HMAC обычно используется для получения ключа хэш сообщения. Если вы замените ключ солью и сообщение своим паролем, вы можете использовать HMAC, чтобы получить соленый хэш пароля. – dtb

+0

Есть ли способ расшифровать соленый пароль? – Sana

12

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

+0

Жаль, что этот ответ не был ориентирован на код, как принятый. это очень полезно и быстро реализовать. благодаря! – zanlok

1

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

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

+3

Я подозреваю, что законность во многом зависит от того, где вы находитесь. В некоторых юрисдикциях вам запрещено даже смотреть на декомпилированный код самостоятельно, не говоря уже о его публикации, чтобы другие смотрели! – LukeH

+2

Хотя с Visual Studio 2008 можно просмотреть исходный код .net при отладке, если вы впервые согласились с MS T & C для этого. –

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.

+0

Может ли временная метка быть хорошей солью? или обнаружение такого факта может скомпрометировать весь алгоритм? – abatishchev

+0

Временная метка не работает, потому что, когда вы идете проверить хэш против нового ввода, время будет отличаться. – Fantius

+0

Если вы не храните временную метку вместе с дайджестом, в этом случае она будет работать, но не будет очень безопасной. – Fantius