SHA512 против Blowfish и Bcrypt [закрыто]

222

Я смотрю на алгоритмы хеширования, но не могу найти ответ.

  • Bcrypt использует Blowfish
  • Blowfish лучше, чем MD5
  • Q: но Blowfish лучше, чем SHA512?

Спасибо..

Обновить:

Я хочу уточнить, что я понимаю разницу между хешированием и шифрованием. Что побудило меня задать вопрос таким образом, так это статья , в которой автор называет bcrypt «адаптивным хешированием».

Поскольку bcrypt основан на Blowfish, я подумал, что Blowfish - это алгоритм хеширования. Если это как указано в ответах шифрование, то мне кажется, что в этой статье не должно быть места. Что еще хуже, он приходит к выводу, что bcrypt - лучший. Что меня теперь смущает, так это то, что класс phpass (я думаю, он используется для хеширования паролей) использует bcrypt (т.е. blowfish, то есть шифрование). Основываясь на этой новой информации, которую вы, ребята, говорите мне (Blowfish - шифрование), этот класс звучит неправильно. Я что-то упускаю?

Крис
источник
2
Это не так; см. обновления к моему ответу для объяснения того, как работает bcrypt и почему он служит для той же цели, что и алгоритм одностороннего алгоритма на основе хеша.
Эриксон
3
bcryptпросто имеет более высокий «коэффициент работы» по умолчанию. Предполагается, что SHA не ... если только вы не используете passhash9, который можно использовать вместе с рабочим фактором. почему этот вопрос закрыт? это далеко от ответа, но очень важно.
1
Ссылка в вопросе не работает ...............
Pacerier

Ответы:

320

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

Если вы настаиваете на знании того, что «лучше», SHA-512 провела подробные обзоры NIST и других. Это хорошо, но были признаны недостатки, которые, хотя и не используются в настоящее время, привели к конкуренции SHA-3 за новые алгоритмы хеширования. Кроме того, имейте в виду, что изучение алгоритмов хеширования «новее», чем изучение шифров, и криптографы все еще изучают их.

Несмотря на то, что bcrypt в целом не подвергался такому тщательному анализу, как сам Blowfish, я считаю, что, основываясь на шифре с хорошо понятной структурой, он обладает некоторой присущей ему безопасностью, которой не хватает при аутентификации на основе хеша. Кроме того, проще использовать обычные графические процессоры в качестве инструмента для атаки на хэши на основе SHA-2; Из-за требований к памяти для оптимизации bcrypt требуется более специализированное оборудование, такое как FPGA, с некоторым количеством встроенной оперативной памяти.


Примечание: bcrypt - это алгоритм, который использует Blowfish для внутреннего использования. Это не сам алгоритм шифрования. Он используется для необратимого сокрытия паролей, так же как хеш-функции используются для «одностороннего хеширования».

Криптографические алгоритмы хеширования разработаны так, чтобы их невозможно было перевернуть. Другими словами, учитывая только выходные данные хеш-функции, нужно «навсегда», чтобы найти сообщение, которое выдаст тот же хэш-вывод. Фактически, должно быть невозможно вычислить любые два сообщения, которые производят одинаковое хеш-значение. В отличие от шифра, хеш-функции не параметризуются с помощью ключа; один и тот же вход всегда будет давать один и тот же выход.

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

Теперь рассмотрим bcrypt. Он использует Blowfish для шифрования магической строки, используя ключ, «полученный» из пароля. Позже, когда пользователь вводит пароль, ключ выводится снова, и если зашифрованный текст, полученный путем шифрования с этим ключом, совпадает с сохраненным зашифрованным текстом, пользователь аутентифицируется. Зашифрованный текст хранится в таблице «паролей», но производный ключ никогда не сохраняется.

Чтобы нарушить криптографию, злоумышленник должен восстановить ключ из зашифрованного текста. Это называется атакой с "известным открытым текстом", поскольку атака знает магическую строку, которая была зашифрована, но не используемый ключ. Blowfish был тщательно изучен, и пока не известно ни одной атаки, которая позволила бы злоумышленнику найти ключ с единственным известным открытым текстом.

Таким образом, так же, как и необратимые алгоритмы криптографических дайджестов, bcrypt производит необратимый вывод, исходя из пароля, соли и коэффициента стоимости. Его сила заключается в устойчивости Blowfish к известным атакам открытого текста, что аналогично «первой атаке перед изображением» в алгоритме дайджеста. Поскольку его можно использовать вместо алгоритма хеширования для защиты паролей, bcrypt смущенно называют самим алгоритмом хеширования.

Предполагая, что радужные таблицы были сорваны при правильном использовании соли, любая действительно необратимая функция превращает атакующего в метод проб и ошибок. А скорость, с которой злоумышленник может делать испытания, определяется скоростью этого необратимого алгоритма хеширования. Если используется одна итерация хэш-функции, злоумышленник может выполнить миллионы попыток в секунду, используя оборудование стоимостью порядка 1000 долларов, проверяя все пароли длиной до 8 символов в течение нескольких месяцев.

Однако если дайджест-вывод «возвращается» тысячи раз, то для проверки того же набора паролей на этом оборудовании потребуются сотни лет. Bcrypt достигает того же эффекта «усиления ключа», повторяя его в своей процедуре получения ключа, и правильный метод на основе хеша, такой как PBKDF2, делает то же самое; в этом отношении оба метода похожи.

Итак, моя рекомендация bcrypt основана на предположениях 1), что Blowfish имеет такой же уровень проверки, что и семейство хеш-функций SHA-2, и 2) что криптоаналитические методы для шифров лучше разработаны, чем методы для хеш-функций.

Эриксон
источник
4
+1 отличный пост. Но у меня есть два вопроса. Blowfish был заменен на два более десяти лет назад, не должна ли система использовать современные примитивы? Кроме того, тысячи итераций кажутся бесполезными в таких системах, как веб-приложения, в которые в любой момент входит много людей. Например, PBKDF2 реализуется только в сценариях, когда одновременно регистрируется 1 человек, например функция string2key для зашифрованной файловой системы. Я использую пословицу «Если он слишком тяжел для атакующего, то он слишком тяжел для вашего сервера». Что вы думаете?
Ладья
17
Я не думаю, что есть что-то не так с использованием более современного примитива. Уязвимости часто обнаруживаются с течением времени, и Twofish был разработан с использованием знаний, полученных от Blowfish. Однако я не знаю конкретных уязвимостей, которые могли бы сделать недействительным использование Blowfish, поэтому можно было бы привести аргумент «если не сломал». Ваша пословица о нападающих не звучит мне хорошо. Даже если вы выберете алгоритм, который злоумышленнику потребует годы для проверки миллиарда паролей, он будет занимать незначительную долю времени в легитимном приложении.
Эриксон
15
Если вы посмотрите на спецификацию любой хеш-функции, вы не увидите ничего о «соли». Единственный параметр - это сообщение, которое нужно переварить. Просмотрите спецификацию любого шифра, и вы увидите, что функция параметризована с помощью ключа. «Соль», которая может (или не может ) использоваться вместе с хешем, является просто частью сообщения. Алгоритм хеширования не требует этого, не обрабатывает его специально и не может отличить его от остальной части сообщения. Таким образом, хотя сообщения часто изменяются с помощью соли, данное сообщение создает только один хэш.
erickson
1
@ Андрей D Как пентестер, я сообщаю о приложениях, которые блокируют учетные записи, и я сообщаю о приложениях, которые не защищают от грубой силы. В идеале нарушающий IP-адрес должен разрешить код проверки, кроме того, если имя пользователя предназначено (даже если это имя пользователя не существует), то эта учетная запись должна выполнить проверку кода перед проверкой подлинности. Применение ограничения скорости X в минуту также допустимо. Связанный: security.stackexchange.com/questions/25444/…
ладья
2
@rook: хотя приложения, ограничивающие скорость, являются хорошей практикой, в этом случае вы можете предположить, что база данных была загружена и размещена на оборудовании, которое не имеет описанного вами ограничения скорости.
Эллерт ван Коперен
50

Я согласен с ответом Эриксона, с одной оговоркой: для целей аутентификации по паролю bcrypt намного лучше, чем одна итерация SHA-512 - просто потому, что он намного медленнее. Если вы не понимаете, почему медлительность является преимуществом в этой конкретной игре, прочитайте статью, на которую вы ссылаетесь снова (прокрутите вниз до « Скорость - это именно то, чего вы не хотите в хэш-функции пароля »).

Конечно, вы можете построить алгоритм безопасного хеширования паролей вокруг SHA-512, повторяя его тысячи раз, точно так же, как работает алгоритм PHK MD5. Ульрих Дреппер сделал именно это для крипты glibc (). Тем не менее, нет особой причины делать это, если у вас уже есть протестированная реализация bcrypt.

кафе
источник
3
Надеюсь, мой ответ проясняет, что одной итерации хеша недостаточно (к сожалению, даже этот элементарный уровень знаний не может быть принят). «Если используется одна итерация хеш-функции, злоумышленник может выполнить миллионы попыток в секунду, используя оборудование стоимостью порядка 1000 долларов, проверяя все пароли длиной до 8 символов в течение нескольких месяцев. Если, однако, вывод дайджеста «возвращают» тысячи раз, тестирование одного и того же набора паролей на этом оборудовании займет сотни лет. Bcrypt достигает того же эффекта «усиления ключа» путем итерации… »
erickson
@erickson: Да, хотя я думаю, что вы, возможно, похоронили Леда там. Я пытался подчеркнуть, что прямое сравнение bcrypt и SHA-512 на самом деле не актуально, потому что одна - это функция получения ключа, а другая - просто криптографический примитив, который сам по себе не подходит.
Кафе
1
Использование тысяч раундов SHA-512 не является неслыханным и, учитывая его включение в различные cryptреализации (в том числе в PHP, который я использую), когда я прочитал оригинальный вопрос, я даже предположил, что имел в виду OP, когда он спросил о SHA-512 - что он на самом деле имел в виду тысячи раундов SHA-512 против bcrypt, который сам использует сотни или тысячи итераций.
Томасруттер
33

Blowfish не является алгоритмом хеширования. Это алгоритм шифрования. Это означает, что вы можете зашифровать что-то с помощью Blowfish, а затем вы можете расшифровать его обратно в обычный текст.

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

Это две разные вещи, предназначенные для разных задач. Не существует «правильного» ответа на вопрос «Является ли Blowfish лучше, чем SHA512?» С таким же успехом можно спросить: "Яблоки лучше кенгуру?"

Если вы хотите прочитать больше по теме, вот несколько ссылок:

лощина
источник
18
Я думаю, что вопрос заключается в использовании bcrypt в качестве необратимой защиты паролей, так же как для этой цели используется хеширование.
Эриксон
3
@erickson текст "Q: но Blowfish лучше, чем SHA512?" мне кажется довольно ясным и показывает, что ОП не понимает различий между двумя алгоритмами
Глен
1
ОП здесь. На самом деле, основываясь на ответе Глена о том, что blowfish - это алгоритм шифрования (который, как я понимаю, отличается от хеширования), теперь я понимаю, что мой вопрос «да» был сбит с толку. Что сейчас сбивает с толку, так это то, что класс phpass (я думаю, что он используется для хеширования паролей) использует bcrypt (т.е. blowfish, то есть шифрование). Если blowfish - это шифрование, почему phpass использует его для хеширования паролей, для меня это кажется недостатком, нет? Я что-то упускаю?
Крис
2
однако возникает вопрос, какие из яблок и кенгуру лучше подходят для конкретной задачи. Blowfish - лучшая хеширующая функция, чем sha, потому что она требует времени для хэширования. Большинство реализаций ша, которые я видел, очень быстрые. Вам нужен медленный алгоритм хеширования паролей.
Джон Николас
Это правильный ответ, что Blowfish является алгоритмом шифрования, но в этом контексте (например, при использовании в bcrypt) он используется в качестве алгоритма хеширования, получая ключ из строки источника и используя его для шифрования магического числа. Это делает его необратимым, по сути, функцию хеширования. Вы не можете вычислить ключ из шифра, даже если вы знаете открытый текст и зашифрованные данные.
Томасруттер
4

Blowfish не лучше, чем MD5 или SHA512, так как они служат разным целям. MD5 и SHA512 - это алгоритмы хеширования, Blowfish - алгоритм шифрования. Две совершенно разные криптографические функции.

blowdart
источник
2

Я бы порекомендовал реализацию крипта на основе SHA-256 / SHA-512 Ульриха Дреппера.

Мы перенесли эти алгоритмы на Java, и вы можете найти их свободно лицензированную версию по адресу ftp://ftp.arlut.utexas.edu/java_hashes/ .

Обратите внимание, что большинство современных (L) Unices поддерживают алгоритм Drepper в своих файлах / etc / shadow.

Джонатан Эбби
источник
PWDTK sourceforge.net/projects/pwdtknet использует HMAC-SHA512, однако он делает это на протяжении многих итераций, чтобы создать «медлительность», то есть растяжение клавиш, о чем здесь говорили другие. BCrypt лучше, чем один SHA-512, как уже упоминалось, однако, если вы используете SHA-512 в чем-то вроде PBKDF2, то вы в полной безопасности (если вы используете большую криптослучайную соль и достаточно итераций, чтобы заставить время создайте радужную таблицу) API, который я только что опубликовал, создан мной и будет делать то, что вы хотите в .NET, если это именно то, для чего вы разрабатываете (для будущих читателей это будет полезно)
thashiznets
2

Я только сталкивался с этим:

http://codahale.com/how-to-safely-store-a-password/

Может ли автор этой статьи ошибаться?

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