.NET 3.5 — хеширование пароля с помощью System.Cryptography

Я немного новичок в вопросах безопасности и особенно в криптографии.

В приложении, которое мы создаем (приложение ASP.net, построенное на .NET 3.5), мы в настоящее время используем базы данных для сохранения информации об аутентификации наших пользователей (на данный момент AD и т. д. не вариант). Намерение состоит в том, чтобы сделать односторонний хэш паролей с использованием SHA256Managed при создании пользователя, а затем проверить пользователей, используя то же самое. В идеале мы не хотим использовать какие-либо сторонние dll для алгоритма хеширования, если только это не является абсолютно необходимым, чтобы избежать ненужных зависимостей.

Вопросы: 1. Есть ли лучший вариант, чем односторонний хеш с солью? 2. Является ли SHA256 достаточно надежным/безопасным вариантом или нам следует рассмотреть что-то еще? 3. Является ли реализация SHA256Managed в System.Cryptography достаточно хорошей с точки зрения скорости и т. д., или нам следует рассмотреть альтернативы сторонних производителей?

Любые указатели относительно подхода/реализации будут полезны.


person Jagmag    schedule 23.06.2010    source источник


Ответы (5)


  1. Да, сканирование сетчатки глаза (шучу). Хранение паролей в виде хэшей с солью — правильный путь.
  2. SHA256 хорош. Очевидно, я не знаю, над каким приложением вы работаете, но SHA256 хорош для подавляющего большинства проектов. Вы всегда можете перейти к большей длине ключа (384, 512), если это необходимо. Проконсультируйтесь с вашим архитектором безопасности.
  3. SHA256Managed (мы говорим о .net, верно?) хорош. Мы используем его в наших проектах.

Также рекомендуем прочитать это: http://www.obviex.com/samples/hash.aspx< /а>

person DmitryK    schedule 23.06.2010
comment
да. Это реализация .NET, о которой я говорил. Спасибо за ссылку. - person Jagmag; 23.06.2010
comment
Привет! Поскольку предпочтение отдается использованию алгоритмов, встроенных в саму структуру .NET, я думаю, что это, возможно, тот вариант, который я сейчас выберу. Спасибо за помощь. Однако решение о том, стоит ли использовать SHA256Managed / SHA512Managed, еще не принято. - person Jagmag; 23.06.2010
comment
-1 за утверждение, что SHA-2 хорош для хеширования паролей. Это слишком быстро. Вместо этого используйте PBKDF2, bcrypt или scrypt. - person CodesInChaos; 27.11.2012
comment
хм, я ответил на это 2,5 года назад. Тогда SHA256 считался хорошим. Я согласен с тем, что алгоритмы хеширования паролей нужно выбирать с умом, и все ваши предложения действительны (но Microsoft нужно лучше поработать, чтобы сделать все эти алгоритмы доступными для разработчиков как часть стандартной структуры) - person DmitryK; 10.12.2012

В свое время я провел некоторое исследование по этому вопросу, и пришел к выводу, что BCrypt — один из лучших способов сделать односторонний хэш.

Вы можете увидеть реализацию C# здесь: http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Кроме того, что хорошо в BCrypt, так это то, что вы можете решить, сколько раундов вы хотите, чтобы он прошел.

Таким образом, вы можете сделать так, чтобы шифрование занимало около 1 секунды, например. Для пользователя это приемлемое время ожидания, но для того, кто пытается атаковать вас с помощью грубой силы, 1 секунда — это вечность.

Я не эксперт по безопасности, так что воспринимайте то, что я здесь говорю, как недоверие. Соль, которую вы можете отправить в свой метод BCrypt :)

Кроме того, вот несколько советов от Этвуда по этому поводу: >http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

Обновление:

После ответа на этот вопрос NuGet значительно упростил использование BCrypt: http://nuget.org/packages?q=bcrypt

Я не могу поручиться за какую-либо конкретную реализацию, поэтому взгляните на код, но это должно сделать использование и интеграцию BCrypt намного проще.

person CubanX    schedule 23.06.2010
comment
Спасибо CubanX, я обязательно поищу BCrypt - person Jagmag; 23.06.2010
comment
Немного слабее, чем bcrypt, но уже является частью .net framework: PBKDF2-SHA-1 с использованием Класс Rfc2898DeriveBytes. - person CodesInChaos; 28.11.2012

Да, в SHA256 нет ничего плохого, и, безусловно, SHA256Managed будет «достаточно быстрым» для большинства случаев использования (я уверен, вы не ожидаете, что будете проверять 1000 запросов на вход в секунду, и даже если вы это сделаете, остальные сайт по-прежнему затмевает запросы на вход...)

Но рассматривали ли вы элементы членства, встроенные в платформу? ? Они уже проделали всю тяжелую работу с точки зрения безопасного хранения учетных данных, а также реализации всех функций поддержки (таких как сброс пароля и т. д.).

person Dean Harding    schedule 23.06.2010
comment
На самом деле... я слышал о членстве, но еще не изучил его. Ваш комментарий напомнил мне, что мне нужно. Спасибо! :-) - person Jagmag; 23.06.2010

Хранение хэшей паролей с солью правильно. Однако легко ошибиться даже в этом. Конечно, прямо сейчас SHA256 будет держать злодеев в страхе, но подождите несколько лет. Внезапно SHA256 может показаться уже не таким безопасным. Вам необходимо использовать BCrypt, алгоритм хеширования с перспективой.

person Joel Coehoorn    schedule 23.06.2010

Проблема с выполнением только одного прохода SHA256 заключается в том, что это слишком быстро, и один с отличным оборудованием может легко генерировать радужные таблицы для большого количества солей ... чтобы обойти это, вам нужно выполнить растяжение ключа .... я не собираюсь дать вам урок по растяжению ключа, но реализация bcrypt, о которой говорят люди, выполняет растяжение ключа. Если вам нужна более современная альтернатива bcrypt, которая использует HMACSHA256 или 512 в .NET, я рекомендую этот API:

https://sourceforge.net/projects/pwdtknet/

person thashiznets    schedule 04.10.2012