Как использовать 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 лучше по безопасности. Вы можете получить представление из этого сравнения