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

Как использовать SHA1 или MD5 в С#? (Какой из них лучше в производительности и безопасности для аутентификации)

В С#, как мы можем использовать SHA1 автоматически?
SHA1 лучше, чем MD5? (Мы используем хэширование для имени пользователя и пароля и требуем скорости для аутентификации)

4b9b3361

Ответ 1

Не уверен, что вы подразумеваете под автоматически, но вы действительно должны использовать SHA256 и выше. Также всегда использовать Соль (code) с вашими хешами. Сторона примечания, по прошествии времени, использование упрочненных хэшей намного лучше, чем использование простой хэш-функции на основе скорости. I.e: хеширование более нескольких итераций или использование уже проверенных хэширующих функций, таких как bcrypt (о чем я упоминал ниже, я считаю). Пример кода для использования хэш-функции SHA256 в .NET выглядит следующим образом:

byte[] data = new byte[DATA_SIZE];
byte[] result;

using(SHA256 shaM = new SHA256Managed()) {
    result = shaM.ComputeHash(data);
}

Сделаем трюк для вас, используя SHA256, и его можно найти в MSDN.


Sidenote о "взломе" SHA1: Включение взлома SHA-1 в перспективе

Ответ 2

SHA1 сильнее MD5, поэтому, если у вас есть выбор, было бы лучше использовать его. Вот пример:

public static string CalculateSHA1(string text, Encoding enc)
{
    byte[] buffer = enc.GetBytes(text);
    SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
    return BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
}

Ответ 3

От MSDN

byte[] data = new byte[DATA_SIZE];
byte[] result; 

SHA1 sha = new SHA1CryptoServiceProvider(); 
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);

Ответ 4

Оба слишком быстры, чтобы использоваться, по крайней мере, по крайней мере. Используйте "Укрепление ключа", чтобы "замедлить" процедуру хэширования пароля. Скорость, к сожалению, является противником защиты паролем.

Как медленно идет достаточно медленно? Замедление хэша паролей от ~ микросекунд до ~ сотен миллисекунд не будет отрицательно влиять на воспринимаемую производительность вашего приложения... но сделает взломать пароли буквально на сто тысяч раз медленнее.

Просмотрите эту статью для получения более подробной информации: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

Проблема в том, что MD5 работает быстро. Так же и его современные конкуренты, такие как SHA1 и SHA256. Скорость - это цель дизайна современного безопасного хэша, поскольку хеши являются строительным блоком почти каждой криптосистемы и обычно получают запрос по требованию для каждого пакета или для каждого сообщения.

Скорость - это именно то, чего вы не хотите в хэш-функции пароля.

... snip...

Игра с парольной атакой забивается вовремя, чтобы взломать пароль X. С радужными столами время зависит от того, насколько велика ваша таблица и насколько быстро вы можете ее искать. С инкрементными взломщиками время зависит от того, насколько быстро вы можете запустить хеш-функцию пароля.

Тем не менее, используйте BCrypt. Недавно был разработан SCrypt, но я сомневаюсь, что для него существуют все стабильные (или готовые к выпуску) библиотеки. Теоретически SCrypt утверждает, что улучшает BCrypt. "Построение собственного" не рекомендуется, но итерация MD5/SHA1/SHA256 в тысячи раз должна делать трюк (то есть: усиление ключа).

И в случае, если вы не знаете о них, обязательно прочитайте в Радужных таблицах. Основные элементы безопасности.

Ответ 6

Я бы хотел использовать эти вещи.

MD5, SHA1/256/384/512 с необязательным параметром кодирования.

Othere HashAlgorithms. Спасибо Дарину Димитрову.

public static string MD5Of(string text)
{
    return MD5Of(text, Encoding.Default);
}
public static string MD5Of(string text, Encoding enc)
{
    return HashOf<MD5CryptoServiceProvider>(text, enc);
}
public static string SHA1Of(string text)
{
    return SHA1Of(text, Encoding.Default);
}
public static string SHA1Of(string text, Encoding enc)
{
    return HashOf<SHA1CryptoServiceProvider>(text, enc);
}

public static string SHA384Of(string text)
{
    return SHA384Of(text, Encoding.Default);
}
public static string SHA384Of(string text, Encoding enc)
{
    return HashOf<SHA384CryptoServiceProvider>(text, enc);
}

public static string SHA512Of(string text)
{
    return SHA512Of(text, Encoding.Default);
}
public static string SHA512Of(string text, Encoding enc)
{
    return HashOf<SHA512CryptoServiceProvider>(text, enc);
}

public static string SHA256Of(string text)
{
    return SHA256Of(text, Encoding.Default);
}
public static string SHA256Of(string text, Encoding enc)
{
    return HashOf<SHA256CryptoServiceProvider>(text, enc);
}

public static string HashOf<TP>(string text, Encoding enc)
    where TP: HashAlgorithm, new()
{
    var buffer = enc.GetBytes(text);
    var provider = new TP();
    return BitConverter.ToString(provider.ComputeHash(buffer)).Replace("-", "");
}

Ответ 7

MD5 лучше работает, а SHA1 лучше для безопасности. Вы можете получить представление об этом сравнении

введите описание изображения здесь