BCrypt - хороший алгоритм хеширования для использования в C #? Где я могу найти его? [закрыто]

129

Я читал, что при хешировании пароля многие программисты рекомендуют использовать алгоритм BCrypt.

Я программирую на C #, и мне интересно, знает ли кто-нибудь о хорошей реализации BCrypt? Я нашел эту страницу , но не знаю, поддельная она или нет.

На что следует обратить внимание при выборе схемы хеширования пароля? BCrypt - «хорошая» реализация?

Svish
источник

Ответы:

148

Во-первых, некоторые важные термины:

Хеширование - процесс взятия строки и создания последовательности символов, которую нельзя вернуть к исходной строке.

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

Rainbow Table - справочная таблица, которая содержит все варианты символов, хешированных с помощью определенного алгоритма хеширования.

Поваренная соль - известная случайная строка, добавляемая к исходной строке перед ее хешированием.

Для .NET Framework Bcrypt еще не имеет проверенной эталонной реализации. Это важно, потому что невозможно узнать, есть ли серьезные недостатки в существующей реализации. Вы можете получить реализацию BCrypt для .NET здесь . Я не знаю достаточно о криптографии, чтобы сказать, хорошая это реализация или плохая. Криптография - очень глубокая область. Не пытайтесь создать свой собственный алгоритм шифрования . Шутки в сторону.

Если вы собираетесь реализовать собственную защиту паролем (вздох), вам нужно сделать несколько вещей:

  1. Используйте относительно безопасный алгоритм хеширования .
  2. Соли каждый пароль перед хешированием.
  3. Используйте уникальную длинную соль для каждого пароля и сохраните соль вместе с паролем.
  4. Требовать надежные пароли .

К сожалению, даже если вы сделаете все это, целеустремленный хакер все равно сможет вычислить пароли, это займет у него очень много времени. Это ваш главный враг: время .

Bcrypt алгоритм работает , потому что она занимает пять порядков больше , чтобы хэш пароля , чем MD5 ; (и все еще намного длиннее, чем AES или SHA-512). Это заставляет хакера тратить намного больше времени на создание радужной таблицы для поиска ваших паролей, что значительно снижает вероятность того, что ваши пароли будут под угрозой взлома.

Если вы солите и хешируете свои пароли, и каждая соль отличается, тогда потенциальному хакеру придется создать радужную таблицу для каждого варианта соли , просто чтобы иметь радужную таблицу для одного соленого + хешированного пароля. Это означает, что если у вас 1 миллион пользователей, хакер должен создать 1 миллион радужных таблиц. Если вы используете одну и ту же соль для каждого пользователя, то хакеру достаточно создать только одну радужную таблицу, чтобы успешно взломать вашу систему.

Если вы не солите свои пароли, то все, что нужно сделать злоумышленнику, - это открыть существующую таблицу Rainbow для каждой реализации (AES, SHA-512, MD5) и просто посмотреть, соответствует ли она хешу. Это уже сделано , злоумышленнику не нужно вычислять эти таблицы Rainbow самостоятельно .

Даже несмотря на все это, вы должны использовать хорошие методы безопасности . Если они могут успешно использовать другой вектор атаки (XSS, SQL-инъекция, CSRF и др. ) На вашем сайте, хорошая защита паролем не имеет значения. Это звучит как спорное утверждение, но думать об этом: Если я могу получить всю вашу информацию пользователя через инъекцию SQL атаку, или я могу получить ваши пользователь , чтобы дать мне свои кук через XSS, то это не имеет значения , насколько хорошо ваш пароль безопасность есть .

Другие источники:

  1. Джефф Этвуд: .NET Encryption Simplified (отлично подходит для обзора хеширования)
  2. Джефф Этвуд: Я только что вошел в систему как вы
  3. Джефф Этвуд: Вы, вероятно, неправильно храните пароли
  4. Джефф Этвуд: скорость хеширования

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

Джордж Стокер
источник
может быть, добавьте к своему солевому абзацу, что соль должна выбираться случайным образом
Жак
2
@Jacco Хороший звонок, добавил. Хотя это не так уж важно. Вы можете просто использовать временную метку входа в систему для соли. Разница в том, что злоумышленник затем должен пересчитать радужную таблицу для каждой соли. Это то, что усложняет задачу, а не то, что она выбрана случайно. Если сделать это случайным образом, это добавит еще один уровень запутывания, но это бесполезно, если злоумышленник сможет увидеть вашу базу данных (что является проблемой, которая в первую очередь вызывает всю нашу душевную боль).
Джордж Стокер
3
Не совсем, соль не обязательно должна быть секретной, просто уникальной для каждого экземпляра. Поскольку уникальный (как во всем мире) невозможен, случайный вариант - следующая лучшая вещь. Кроме того, метка времени не является хорошей солью, поскольку энтропии недостаточно.
Jacco
7
Я бы не согласился с вашим утверждением: «Если они могут успешно использовать XSS или SQL-инъекцию, хорошая защита пароля не имеет значения». Напротив, если они могут успешно внедрить XSS или SQL на ваш сайт, хорошая защита паролем становится еще более важной. Ключевым моментом здесь является «глубокая защита» - вы должны усилить безопасность, насколько это возможно, на каждом уровне вашего приложения.
джеммикейки
2
@jammycakes Совершенно верно; Моя точка зрения была упущена: нельзя просто сказать: «Эй, мы хэшируем и солим наши пароли,« мы в порядке »!»
Джордж Стокер
74

Вы не должны использовать BCrypt в .NET. Вы должны использовать PBKDF2 как есть со встроенной реализацией .NET framework. Это единственная свободно доступная криптографически проверенная реализация в .NET, а также алгоритм, рекомендованный NIST .

StackId ранее использовал BCrypt и перешел на PBKDF2 именно по этой причине:

Для тех, кому интересно, мы хэшируем пароли с помощью PBKDF2. Код Relavent находится здесь ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ) через несколько уровней косвенного обращения. В более ранней итерации мы использовали BCrypt; но перешел на PBKDF2, поскольку он встроен в платформу .NET, тогда как BCrypt потребует от нас проверки реализации (немалое мероприятие).

Кевин Монтроуз, 27 мая 2011 г.

(Обновленная ссылка на GitHub)

Изменить: значение проверенного в криптографических терминах кажется непонятным, подтвержденная реализация означает, что криптографически доказано, что оно реализовано без ошибок. Стоимость этого легко может достигать 20 000 долларов и выше. Я вспоминаю это, когда проводил исследование OpenSSL и читал, где они заявили, что не завершили весь процесс проверки, но если вам нужно полностью убедиться, они могут указать вам правильный путь для этого и упомянули связанные с этим затраты. Некоторые правительственные требования включают в себя требования о проверенных алгоритмах шифрования.

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

Редакция 2014: Для тех, кто сомневается в необходимости использования проверенных криптографических алгоритмов, обратите внимание на опустошение, нанесенное хакерским взломом, использованным в OpenSSL. Это стоимость использования непроверенной реализации. Это безопасно ... пока вы не обнаружите, что любой человек может просто прочитать все содержимое памяти вашего сервера.

Автор изменения, которое представило Heartbleed, Робин Сеггельманн, заявил, что он «пропустил проверку переменной, содержащей длину», и отрицал какое-либо намерение представить некорректную реализацию. После раскрытия информации Heartbleed Сеггельманн предложил сосредоточиться на втором аспекте, заявив, что OpenSSL не проверяется достаточным количеством людей.

Это определение непроверенной реализации. Даже самый незначительный дефект может привести к нарушению всей безопасности.

Редактирование 2015: удален язык, основанный на рекомендациях, и заменен абсолютом. Встроенный оригинальный комментарий Кевина Монтроуза для потомков.

Крис Маришич
источник
25
Процитируем связанный комментарий: «[мы] перешли на PBKDF2, поскольку он встроен в платформу .NET, тогда как BCrypt потребует от нас проверки реализации». Обратите внимание, что в комментарии не говорится, что алгоритм лучше, просто команда разработчиков SE считает, что встроенная реализация PBKDF2 более надежна, чем внешняя библиотека (что, в конечном итоге, является вызовом для суждения).
Писквор покинул здание
3
@Piskvor Я обновил свой ответ. Речь идет не о том, что команда SO считает безопасным, а о выборе между проверенной по своей сути безопасностью или надежной безопасностью. Последнее, когда дело касается криптографии, недопустимо.
Крис Марисик,
6
Интересно, как ТАК перенес все хешированные пароли bcrypt в новые хеши? Разве им не понадобятся необработанные пароли для хеширования с использованием нового алгоритма?
Дхармендар Кумар 'DK'
8
@DK Я даже не думаю, что вам нужно просить их сбросить пароли. Я верю, что при следующем входе в систему (где они предоставляют свой пароль в виде открытого текста) вы сможете это сделать.
Matt Kocaj 08
12
Это плохой совет, и я удивлен, что за него так много голосов. Проверка реализации BCrypt на управляемом языке намного, намного более тривиальна, чем проверка чего-то вроде полной реализации SSL на C. Heartbleed совершенно не имеет значения; вам лучше упомянуть что-то вроде проблем с принуждением типа PHP с проверками равенства хешей. Кроме того, хотя PBKDF2 в значительной степени подходит с практической точки зрения, он представляет собой KDF, а не алгоритм хеширования паролей, тогда как BCrypt подходит лучше. Тем не менее, в наши дни в любом случае имеет смысл использовать Argon2, для которого есть хорошо протестированная библиотека C #
Polynomial