Заключение: 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 в качестве ключевой функции деривации. Есть ли вообще веские основания полагать, что атака столкновения или вторая атака на прообразы могут быть в конечном итоге превращены в первую атаку на прообраз?