.NET 3.5 - хеширование пароля с помощью System.Cryptography - PullRequest
1 голос
/ 23 июня 2010

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 23 июня 2010

Я провел некоторое исследование по этому вопросу в тот же день, и все пришли к выводу, что 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намного проще.

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

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

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

0 голосов
/ 23 июня 2010

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

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

Пожалуйста, рассмотрите также это: http://www.obviex.com/samples/hash.aspx

0 голосов
/ 23 июня 2010

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

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

...