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

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

7 ответов

Решение

Не уверен, что вы подразумеваете под автоматически, но вы должны действительно использовать SHA256 и выше. Также всегда используйте соль ( код) с вашими хэшами. Примечание: по прошествии времени использование закаленных хэшей гораздо лучше, чем использование простой хэш-функции, основанной на скорости. То есть: хеширование более нескольких сотен итераций или использование уже проверенных хеш-функций, таких как 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 в перспективе

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("-", "");
}

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

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

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

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

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

... отрезать...

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

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

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

Из 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);

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

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("-", "");
}

Используйте SHA1 или SHA2 Алгоритм MD5 проблематичен.

http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5%28v=vs.85% 29.aspx

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

Другие вопросы по тегам