Радужные таблицы паролей (rainbow tables): как работают, где применяются и почему соль ломает весь фокус

Радужные таблицы паролей (rainbow tables): как работают, где применяются и почему соль ломает весь фокус

Радужные таблицы паролей (rainbow tables): как работают, где применяются и почему соль ломает весь фокус

Представьте сейф, который нельзя открыть отмычкой, зато можно попробовать миллионы ключей. Хэш пароля как раз такой «сейф» для строки. Он не раскрывает пароль назад, но позволяет проверять догадки. И вот тут начинается самое интересное. Если догадок много, нужно быстро их проверять. Обычно это делается перебором. Берутся слова из словаря, типичные комбинации, маски вроде «Слово+год», и каждую попытку приходится хэшировать заново.

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

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

Суть идеи и принцип «время в обмен на память»

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

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

Редукция не расшифровывает хэш. Она просто переводит число в строку нужного формата, например в «8 символов из A-Z и 0-9». Чтобы цепочки меньше слипались в один ком, редукцию меняют от шага к шагу. Отсюда и «радужность».

Как по таблице находят пароль

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

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

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

Где это реально применяется

Главная зона применения — это несолёные хэши и предсказуемые пароли. В реальной жизни радужные таблицы чаще всплывают не в «взломе мира», а в аудите и разборе утечек. Если организация хранит пароли как MD5 или SHA-1 без соли, специалист по безопасности может очень быстро показать масштаб проблемы, восстановив значительную долю паролей пользователей.

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

При этом против длинных паролей и современных схем хранения радужные таблицы почти всегда проигрывают. Метод цепляется за слабое место, и если слабого места нет, цепляться не за что.

Почему соль и bcrypt/Argon2 почти убивают метод

Соль — это случайная добавка к паролю перед хэшированием. Она хранится рядом с хэшом и не является секретом. Её задача прозаична и беспощадна. Один и тот же пароль у двух пользователей должен давать разные хэши. Тогда заранее подготовленная таблица перестаёт быть универсальной. Чтобы радужные таблицы работали, их пришлось бы строить отдельно под каждую соль, а это уже не «чит-код», а бессмысленная каторга.

Второй удар по методу наносят медленные функции для паролей. bcrypt, scrypt, Argon2 и PBKDF2 специально сделаны так, чтобы считать их дорого по времени и иногда по памяти. Это превращает предвычисления в крайне затратное занятие. Хорошая практическая точка опоры по хранению паролей — это рекомендации OWASP.

Именно поэтому радужные таблицы сегодня чаще служат лакмусовой бумажкой. Если они применимы, значит у системы, скорее всего, проблемы не на уровне «тонкой криптографии», а на уровне базовой гигиены.

Заключение

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

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

радужные таблицы rainbow tables взлом паролей хэш пароля соль пароля
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

Вход по SSH

Проникаем за кулисы сложных атак и показываем то, что обычно скрыто за консолью и логами.

Получи root-доступ!

Дэни Хайперосов

Блог об OSINT, электронике, играх и различных хакерских инструментах