Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JagmagОтветов: 5

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

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

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

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

encryptionpasswordssecuritycryptography

Ответы

Ответ 1 · DmitryK

  1. Да, сканирование сетчатки глаза (шучу). Хранение паролей в виде хэшей с солью - правильный путь.
  2. SHA256 хорош. Очевидно, я не знаю, над каким приложением вы работаете, но SHA256 хорош для подавляющего большинства проектов. Вы всегда можете перейти к большей длине ключа (384, 512), если это необходимо. Проконсультируйтесь с вашим архитектором безопасности.
  3. 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

Обновление:

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

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

Ответ 3 · Dean Harding

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

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

Ответ 4 · Joel Coehoorn

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

Ответ 5 · thashiznets

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы