.NET 3.5 - хеширование пароля с помощью System.Cryptography
Автор вопроса: JagmagОтветов: 5
Я немного новичок в вопросах безопасности и особенно в криптографии.
В приложении, которое мы создаем (приложение ASP.net, построенное на .NET 3.5), мы в настоящее время используем базы данных для сохранения информации об аутентификации наших пользователей (на данный момент AD и т. д. не вариант). Намерение состоит в том, чтобы сделать односторонний хэш паролей с использованием SHA256Managed при создании пользователя, а затем проверить пользователей, используя то же самое. В идеале мы не хотим использовать какие-либо сторонние dll для алгоритма хеширования, если только это не является абсолютно необходимым, чтобы избежать ненужных зависимостей.
Вопросы: 1. Есть ли лучший вариант, чем односторонний хеш с солью? 2. Является ли SHA256 достаточно надежным/безопасным вариантом или нам следует рассмотреть что-то еще? 3. Является ли реализация SHA256Managed в System.Cryptography достаточно хорошей с точки зрения скорости и т. д., или нам следует рассмотреть альтернативы сторонних производителей?
Любые указатели относительно подхода/реализации будут полезны.
Да, сканирование сетчатки глаза (шучу). Хранение паролей в виде хэшей с солью - правильный путь.
SHA256 хорош. Очевидно, я не знаю, над каким приложением вы работаете, но SHA256 хорош для подавляющего большинства проектов. Вы всегда можете перейти к большей длине ключа (384, 512), если это необходимо. Проконсультируйтесь с вашим архитектором безопасности.
SHA256Managed (мы говорим о .net, верно?) хорош. Мы используем его в наших проектах.
Также рекомендуем прочитать это: http://www.obviex.com/samples/hash.aspx
Ответ 2 · рейтинг 2 · CubanX
В свое время я провел некоторое исследование по этому вопросу, и пришел к выводу, что 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
Я не могу поручиться за какую-либо конкретную реализацию, поэтому взгляните на код, но это должно сделать использование и интеграцию BCrypt намного проще.
Ответ 3 · Dean Harding
Да, в SHA256 нет ничего плохого, и, безусловно, SHA256Managed будет "достаточно быстрым" для большинства случаев использования (я уверен, вы не ожидаете, что будете проверять 1000 запросов на вход в секунду, и даже если вы это сделаете, остальные сайт по-прежнему затмевает запросы на вход...)
Но рассматривали ли вы элементы членства, встроенные в платформу? ? Они уже проделали всю тяжелую работу с точки зрения безопасного хранения учетных данных, а также реализации всех функций поддержки (таких как сброс пароля и т. д.).
Ответ 4 · Joel Coehoorn
Хранение хэшей паролей с солью правильно. Однако легко ошибиться даже в этом. Конечно, прямо сейчас SHA256 будет держать злодеев в страхе, но подождите несколько лет. Внезапно SHA256 может показаться уже не таким безопасным. Вам необходимо использовать BCrypt, алгоритм хеширования с перспективой.
Ответ 5 · thashiznets
Проблема с выполнением только одного прохода SHA256 заключается в том, что это слишком быстро, и один с отличным оборудованием может легко генерировать радужные таблицы для большого количества солей ... чтобы обойти это, вам нужно выполнить растяжение ключа .... я не собираюсь дать вам урок по растяжению ключа, но реализация bcrypt, о которой говорят люди, выполняет растяжение ключа. Если вам нужна более современная альтернатива bcrypt, которая использует HMACSHA256 или 512 в .NET, я рекомендую этот API: