Является ли BCrypt хорошим алгоритмом хеширования для использования в С#? Где я могу найти его?

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

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

Что мне следует знать при выборе схемы хэширования паролей? Является ли BCrypt "хорошей" реализацией?

4b9b3361

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

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

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

Таблица радуги - таблица поиска, содержащая все вариации символов, хэшированных в определенном алгоритме хэширования.

Salt - известная случайная строка, добавленная к исходной строке до ее хэширования.

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

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

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

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

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

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

Даже при всем этом вы должны использовать хорошие методы обеспечения безопасности. Если они могут успешно использовать на вашем сайте другой вектор атаки (XSS, SQL Injection, CSRF, , тогда не имеет значения, насколько хороша ваша защита паролем.

Другие ресурсы:

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

130
ответ дан 14 дек. '10 в 7:32
источник

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

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

Для любопытных были хеширующие пароли с PBKDF2. Рекомендованный код здесь (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 edit:. Для тех, кто задал вопрос о императивности использования проверенных криптографических алгоритмов, посмотрите на разрушение, которое было вызвано heartbleed взломать в OpenSSL. Такова стоимость использования непроверенной реализации. Это защитит... пока вы не узнаете, что любой человек может просто прочитать весь объем памяти вашего сервера.

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

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

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

64
ответ дан 03 июня '11 в 16:59
источник