Какой самый безопасный алгоритм хеширования в .NET Framework? - PullRequest
2 голосов
/ 28 октября 2008

Размер сгенерированного хеша и скорость алгоритма не важны. Меня действительно интересует только то, что это самый безопасный вариант. Я также не хочу использовать сторонние библиотеки.

Версия платформы .NET, которую я использую, если 3.5, если это имеет какое-либо значение.

Ответы [ 3 ]

13 голосов
/ 28 октября 2008

Я думаю, SHA512 будет лучшим выбором из встроенных алгоритмов хеширования. Это самая большая хеш-форма очень безопасного алгоритма.

Также не забывайте использовать соль для защиты хеша от атак по словарю .

11 голосов
/ 06 августа 2012

Вы утверждаете, что скорость алгоритма не важна, но на самом деле это важно.

Многое зависит от определения «безопасный», SHA512 (почти) невозможно повернуть вспять, но на самом деле довольно легко атаковать грубой силой .

Это потому, что он быстрый - его можно считать фундаментальным недостатком «семейства» SHA в том, что он разработан очень быстро.

Это проблема - SHA512 достигает своей цели - быть очень быстрым (это не намного медленнее, чем SHA1), но если вы хакер, пытающийся взломать пароли, которые облегчают взлом. 10 или даже 5 лет назад о серьезной атаке грубой силой не могло быть и речи, теперь это пара модных видеокарт или какое-то облачное время.

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

Хорошим примером алгоритма растягивания ключа является RFC2898 или PBKDF2 - он использует длинную соль и тысячи раз выполняет алгоритм SHA для создания хэша, который медленно воспроизводится.

.Net имеет собственную реализацию этого: Rfc2898DeriveBytes

Они используют его для System.Web.Crypto.HashPassword, но вы можете легко просмотреть их источник , чтобы использовать его в другом месте.

На моем компьютере (довольно старомодном ноутбуке) один хеш .Net Rfc2898DeriveBytes с 1000 итерациями (по умолчанию) занимает около 50 мс, в то время как я могу перебрать около 250 000 хешей SHA512 в секунду.

Так что в .Net сейчас наиболее безопасным вариантом является использование Rfc2898DeriveBytes.

Однако RFC2898 / PBKDF2 имеет слабость - хотя медленные параллельные вычисления становятся все дешевле и дешевле, и для создания каждого хеша не требуется много памяти. Прямо сейчас это довольно грубым, но через 5 или 10 лет?

Таким образом, следующее поколение - это алгоритмы типа bcrypt / scrypt , предназначенные для использования большого количества памяти для каждого хэша, что делает дорогостоящее параллельное выполнение. Хотя существуют реализации .Net, их нет (пока), и я бы с осторожностью использовал их до тех пор, пока они не появятся - их использование повлияет на такие вещи, как одновременный вход в систему (если используется для паролей), и поэтому большой риск для ранних последователей.

0 голосов
/ 19 октября 2012

Пользователь спросил, что является наиболее безопасным алгоритмом хеширования в .NET, PBKDF2 - это не алгоритм хеширования, это метод получения ключей шифрования, и да, лежащая в основе псевдослучайная функция МОЖЕТ быть алгоритмом хеширования, однако в Rfc2898DeriveBytes это фактически HMACSHA1 более x проходит с каждым байтом каждого значения хеша из каждого прохода, XORed со следующим (известно как растяжение ключа).

Таким образом, чтобы ответить на вопрос, HMACSHA512 в настоящее время является наиболее безопасным алгоритмом хеширования в .NET на данный момент.

Если вы хотите «хэшировать» пароли (и я говорю хеш, потому что это не прямой вывод хеш-функции), вот API, который принимает PBKDF2 и использует HMACSHA512 для получения байтов, а не MS Rfc2898DeriveBytes, реализованную с использованием HMACSHA1: https://sourceforge.net/projects/pwdtknet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...