Хеш — не зашифрованный пароль

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

Как помогает предварительный расчёт

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

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

Почему соль меняет расклад

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

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