Вывод: SHA-1 столь же безопасен, как и все остальные, от атак с прообразом, однако его легко вычислить, что означает, что его проще монтировать с помощью грубой силы или атаки по словарю. (То же самое верно для преемников, таких как SHA-256.) В зависимости от обстоятельств, хэш-функция, которая была разработана с учетом вычислительных затрат (например, bcrypt), могла бы быть лучшим выбором.
Некоторые люди часто бросают замечания типа «SHA-1 сломан», поэтому я пытаюсь понять, что именно это означает. Давайте предположим, что у меня есть база данных хэшей паролей SHA-1, и злоумышленник с использованием современного алгоритма взлома SHA-1 и ботнета с 100 000 компьютеров получает доступ к нему. (Наличие 100 тысяч домашних компьютеров означает, что они могут выполнять около 10 ^ 15 операций в секунду.) Сколько времени им потребуется
- узнать пароль любого пользователя?
- узнать пароль данного пользователя?
- узнать пароль всех пользователей?
- найти способ войти как один из пользователей?
- найти способ войти как конкретный пользователь?
Как это изменится, если пароли будут засолены? Имеет ли значение метод посола (префикс, постфикс, оба или что-то более сложное, например, хоринг)?
Вот мое текущее понимание, после некоторого поиска в Google. Пожалуйста, исправьте ответы, если я что-то не так понял.
- Если соли нет, атака радуги немедленно найдет все пароли (кроме очень длинных).
- Если случайная соль достаточно длинная, наиболее эффективный способ узнать пароли - это грубая атака или атака по словарю. Ни коллизионные атаки, ни атаки с использованием изображений не помогают найти действительный пароль, поэтому криптографические атаки на 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 операциях . ( Правка: как объясняет Томас , эта атака является гипотетической конструкцией, которая не применима к сценариям из реальной жизни.) Однако я до сих пор не понимаю, как это представляет опасность для использования SHA-1 в качестве ключевой производной функции. Есть ли вообще веские основания полагать, что атака столкновением или вторая атака с прообразом может в конечном итоге превратиться в первую атаку с прообразом?