Как использовать SHA1 или MD5 в C #? (Какой из них лучше в производительности и безопасности для аутентификации) - PullRequest
25 голосов
/ 18 ноября 2009

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

Ответы [ 7 ]

35 голосов
/ 18 ноября 2009

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

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

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

Подойдет для вас с помощью SHA256 и находится по адресу MSDN .


Знак «взлома» SHA1: Перспектива взлома SHA-1 в перспективе

29 голосов
/ 18 ноября 2009

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("-", "");
}
11 голосов
/ 26 августа 2010

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

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

Подробности смотрите в этой статье: 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 тысячи раз должна помочь (например, усиление ключа).

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

10 голосов
/ 18 ноября 2009

С 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);
1 голос
/ 11 февраля 2014

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

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

Откуда Хеш-алгоритмы . Спасибо Дарину Димитрову.

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("-", "");
}
1 голос
/ 17 октября 2011
0 голосов
/ 15 мая 2016

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

enter image description here

...