Является ли SHA-1 безопасным для хранения паролей?

Заключение: SHA-1 настолько же безопасен, как и любые атаки против проприетарных атак, однако его легко вычислить, а это значит, что проще монтировать атаку грубой силы или словаря. (То же самое верно для таких преемников, как SHA-256.) В зависимости от обстоятельств хеш-функция, которая была рассчитана на дорогостоящие вычисления (например, bcrypt), может быть лучшим выбором.


Некоторые люди бросают замечания, такие как "SHA-1 сломано", поэтому я пытаюсь понять, что именно это означает. Предположим, у меня есть база данных хэшей паролей SHA-1, и к ней получает доступ злоумышленник, имеющий современный алгоритм разбиения SHA-1 и ботнет со 100 000 машинами. (Имея контроль над 100k домашними компьютерами, это означает, что они могут делать около 10 ^ 15 операций в секунду.) Сколько времени им понадобится

  • узнать пароль любого пользователя?
  • узнать пароль данного пользователя?
  • узнать пароль всех пользователей?
  • найти способ войти в систему как один из пользователей?
  • найти способ входа в систему как конкретного пользователя?

Как это изменится, если пароли соленые? Использует ли метод соления (префикс, постфикс, оба или что-то более сложное, как xor-ing)?

Вот мое настоящее понимание, после некоторого поиска. Пожалуйста, исправьте ответы, если я что-то не понял.

  • Если соль отсутствует, радужная атака сразу же найдет все пароли (кроме очень длинных).
  • Если существует достаточно длинная случайная соль, наиболее эффективным способом поиска паролей является грубая сила или словарная атака. Ни столкновения, ни пропримажные атаки не помогают в поиске фактического пароля, поэтому криптографические атаки на SHA-1 здесь не помогают. Даже не имеет значения, какой алгоритм используется - можно даже использовать MD5 или MD4, и пароли будут столь же безопасными (есть небольшая разница, потому что вычисление хэша SHA-1 медленнее).
  • Чтобы оценить, насколько безопасным является "безопасное", предположим, что один запуск sha1 занимает 1000 операций, а пароли содержат прописные, строчные и цифровые символы (то есть 60 символов). Это означает, что злоумышленник может тестировать потенциальный пароль 10 15 * 60 * 60 * 24/1000 ~ = 10 17. Для атаки грубой силы это означает, что тестирование всех паролей до 9 символов за 3 часа, до 10 символов в неделю, до 11 символов в год. (Требуется в 60 раз больше для каждого дополнительного персонажа.) Атака со словарем намного быстрее (даже злоумышленник с одним компьютером может отключить его через часы), но только находит слабые пароли.
  • Чтобы войти в систему как пользователь, злоумышленнику не нужно определять точный пароль; достаточно найти строку, которая приводит к тому же хэшу. Это называется первой атакой на прообраз. Насколько я могу судить, на SHA-1 нет прообразных атак. (Атака с применением грубой силы займет 2 160 что означает, что нашему теоретическому атакующему понадобится 10 30 лет. Ограничения теоретической возможности составляют около 2 60 при котором атака займет несколько лет.) префиксные атаки против сокращенных версий SHA-1 с незначительными эффект (для уменьшенного SHA-1, который использует 44 шага вместо 80, время атаки сокращается с 2 160 до 2 157). Существуют атаки на столкновение с SHA-1, которые вполне соответствуют теоретическим возможностям (лучшее, что я нашел, сокращает время от 2 80 до 2 52), но они бесполезны в отношении хэшей паролей, даже без соления.

Короче говоря, хранение паролей с SHA-1 кажется совершенно безопасным. Я что-то пропустил?

Обновление: Марсело указал на статью, в которой упоминается вторая атака предварительного прогона в операциях 2 106. (Edit: As Томас объясняет, эта атака является гипотетической конструкцией, которая не относится к сценариям реальной жизни.) Я до сих пор не вижу, как это создает опасность для однако использование SHA-1 в качестве ключевой функции деривации. Есть ли вообще веские основания полагать, что атака столкновения или вторая атака на прообразы могут быть в конечном итоге превращены в первую атаку на прообраз?

Ответ 1

Короткий ответ на ваш вопрос: SHA-1 настолько же безопасен, насколько вы можете получить. MD5 тоже будет хорошо, даже MD4; но это может заставить некоторых инвесторов нервничать. Для связей с общественностью лучше использовать "лучшую" хеш-функцию, например. SHA-256, даже если вы усекаете свой вывод на 160 или 128 бит (чтобы сохранить стоимость хранения). Некоторые из кандидатов SHA-3 round-2 выглядят быстрее, чем SHA-1, будучи, возможно, "более безопасными"; но они все еще немного новы, поэтому придерживаться SHA-256 или SHA-512 было бы более безопасным маршрутом прямо сейчас. Это заставит вас выглядеть профессионально и осторожно, что хорошо.

Обратите внимание, что "безопасно, как вы можете получить", это не то же самое, что "совершенно безопасно". Ниже приведены довольно длительные объяснения.

Об известных атаках:

Известные атаки на MD4, MD5 и SHA-1 связаны с столкновениями, которые не влияют на сопротивление провидения. Было показано, что MD4 имеет несколько недостатков, которые могут быть (только теоретически) использованы при попытке разбить HMAC/MD4, но это не относится к вашей проблеме. Вторая попытка префикса 2 106 в статье Кесли и Шнайера представляет собой общий компромисс, который применяется только к очень длинным входам (2 60 bytes, что миллион терабайт - - обратите внимание, как 106 + 60 превышает 160, и там, где вы видите, что компромисс не имеет в нем ничего магического).

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

О таблицах радуги:

"Радужная атака" - это фактически совместное использование словаря или грубой силы. Он является производным от компиляции памяти во времени, впервые описанного Хеллманом в 1980 году. Предполагая, что у вас есть N возможных паролей (размер ваш словарь или 2 n если вы считаете, что вы используете функцию хэша с выходом из n бит), существует атака, разделяющая время, в которой вы предварительно компилируете N хэшированных паролей и сохраняете их в большой стол. Если вы сортируете хэш-выходы, вы можете получить свой пароль в одном поиске. Радужный стол - это умный способ сохранить этот стол с значительно уменьшенным пространством. Вы храните только N/t хэшированные пароли, и вы взламываете пароли с помощью O (t 2). Таблицы Rainbow позволяют практически обрабатывать заранее вычисленные таблицы намного больше, чем вы можете реально хранить.

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

  • Атака грубой силы/словаря имеет стоимость N для взлома каждого пароля.
  • С заранее вычисленной таблицей злоумышленник платит стоимость N один раз и может впоследствии атаковать многие пароли с очень небольшой дополнительной стоимостью за пароль.
  • Если предварительно вычисленная таблица представляет собой таблицу радуги, то N может быть несколько больше, потому что стоимость хранения уменьшается. Узким местом на N становится мощность процессора, которую может нанести атакующий, а не размер его жестких дисков.

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

О солях:

Соли - это способ победить предварительные вычисления. В приведенном выше описании соль возвращает атакующего к шагу 1: соление препятствует злоумышленнику делиться стоимостью O (N) между несколькими атакованными паролями. Предварительно вычисленные таблицы, тем более радужные столы, уже невозможно.

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

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

Кроме того, соление полезно для общественных отношений.

О стоимости SHA-1:

Простейшая стоимость SHA-1 заключается в хешировании 64-байтового блока. То, как работает SHA-1: данные дополняются, а затем разделяются на 64-байтовые блоки. Стоимость обработки одного блока составляет около 500 тактов в системе Intel Core2, а для одного ядра. MD5 и MD4 быстрее, считайте около 400 и 250 циклов соответственно. Не забывайте, что большинство современных процессоров имеют несколько ядер, поэтому умножайте их соответственно.

Некоторые схемы соления предписывают огромные соли; например то, что входит в хеш-функцию, на самом деле составляет 40000 последовательных копий одной 128-битной соли, за которой следует сам пароль. Это заставляет пароль хешировать более дорогим (в 10000 году с моим примером), как для законного пользователя, так и для злоумышленника. Является ли это хорошей идеей, зависит от настройки. Для входа в настольную систему это хорошо: пользователь даже не заметит, что потребовалось 10 мс для хеширования его пароля, а не 1 мкс; но стоимость для злоумышленника выросла с очень заметным фактором 10000. На общих серверах с тысячами клиентов в секунду совокупная стоимость может стать непомерно высокой. Понятно, что повышение бара тем же фактором для законного пользователя и злоумышленника не является в конечном итоге хорошей защитой; но это может быть полезной идеей в некоторых конкретных ситуациях.

О сетевых атак:

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

Как правило, для защиты паролем гораздо больше окупается система, позволяющая злоумышленнику построить автономную атаку. То, что делают системы Unix: хешированные пароли, которые раньше находились в мире-читаемом файле /etc/password, теперь находятся в файле /etc/shadow, который защищен от доступа на чтение, за исключением нескольких привилегированных приложений. Предполагается, что если злоумышленник может читать /etc/shadow, то у него, вероятно, будет достаточно контроля над системой, что он больше не нуждается в паролях...

Ответ 2

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

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

Короче говоря, вы должны использовать только лучшие инструменты для работы. И SHA-1 значительно отстает от уровня техники.

Для дальнейшего чтения:

Ответ 3

Ваше описание звучит точно для текущего уровня техники.

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

В идеале, однако, вы должны использовать существующий примитив для хранения паролей, например описанный здесь.

Ответ 4

SHA1 - это дайджест сообщений, он был никогда, предназначенным для функции парольного хеширования (или генерации ключа). (Хотя он может быть использован как строительный блок для KDF, например, в PBKDF2 с HMAC-SHA1.)

Функция хэширования паролей должна защищать от атак со словарями и радужных таблиц. Для достижения этой цели были разработаны несколько алгоритмов.

В настоящее время лучшим вариантом является, вероятно, Argon2. Это семейство функций хэширования пароля выиграло конкурс Hash Hash в 2015 году.

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

В Википедии есть страницы для этих функций:

Ответ 5

В SHA-1 обнаружены серьезные уязвимости, которые делают поиск намного быстрее, чем грубая сила. Он по-прежнему в значительной степени неразрешимый, но ожидается, что этого не произойдет слишком долго; параноидальные программисты предпочитают что-то из семейства SHA-2.

Из в этой статье относительно исходного результата в 2005 году:

"Пора ходить, но не бегать, к выходу огня. Вы не видите дыма, но пожарные тревоги ушли".

Это не то, что текущий криптоанализ делает SHA-1 небезопасным, а скорее, что криптовое сообщество обеспокоено тем, что худшие новости могут быть не за горами. Этот страх также относится к SHA-2, который демонстрирует те же недостатки, что и SHA-1, хотя и в гораздо более широком пространстве поиска, поэтому продолжающийся поиск SHA-3.

Короче говоря, SHA-1 сейчас безопасен и, вероятно, наступит некоторое время, но криптообщество будет неудобно прогнозировать.

Ответ 6

По состоянию на февраль 2017 года SHA-1 больше не считается безопасным. Google сообщал об успехах с атаками на столкновение с полной, без ограничений SHA-1 (ссылка для отчета). Для объявления Google нажмите здесь.

Изменить: Как указывали другие, пароли не уязвимы для атак с использованием хеш-коллизий. Однако в качестве общего руководства я бы не выбрал SHA-1 для приложений, связанных с безопасностью. Там есть лучшие альтернативы.

Ответ 7

Если вы храните засоленный пароль, SHA-1 подходит для практических целей. SHA-2 считается более безопасным, но SHA-1 не является проблемой, если у вас нет причин быть действительно параноиком.

Вот что NIST говорит:

Результаты, представленные до сих пор на SHA-1 не называйте его безопасность вопрос. Однако из-за технологии, NIST планирует поэтапный отказ от SHA-1 в пользу более крупных и более сильные хэш-функции (SHA-224, SHA-256, SHA-384 и SHA-512) 2010.