Соль — это одна случайная строка, которую добавляют к паролю перед хешированием. Звучит как мелочь. Но именно она спасает миллиарды паролей от мгновенного взлома. У всех пользователей с паролем «qwerty» будут разные хеши. Сейчас покажем почему.
Пароль одинаковый — хеши абсолютно разные. Взломщик не может узнать, что у двух пользователей один и тот же пароль, и не может использовать одну радужную таблицу против всех.
Напомню коротко: на сервере пароли не хранят в открытом виде — хранят их хеш. Это уже хорошо. Но есть две проблемы, которые делают хеш без соли уязвимым:
Первая: одинаковые пароли дают одинаковые хеши. Если у 1000 человек пароль «123456» — у всех будет один и тот же хеш. Стоит взломать одного — взломаны все. Вторая: у злоумышленника есть радужная таблица — заранее заготовленный справочник. Найти в ней пароль по хешу — вопрос миллисекунд.
Все три хеша одинаковые. Взломщик видит это и понимает — у всех один пароль. И один раз подобрав его, он получает доступ к трём аккаунтам сразу.
К каждому паролю добавили случайную строку. Хеши разные — как будто пароли вообще разные. Взломщик даже не узнает, что все трое использовали «qwerty».
Радужная таблица — это заранее посчитанный справочник пароль → хеш.
Взломщик просто ищет нужный хеш в таблице и получает пароль. Переключите режим и посмотрите, что происходит.
Введите любой пароль и посмотрите, как сервер превращает его в хеш. Переключатель «без соли / с солью» показывает разницу. Соль генерируется случайно каждый раз — обратите внимание, как она меняется при повторной регистрации.
Соль — только половина решения. Вторая половина — алгоритм. MD5 и SHA-256 спроектированы быть быстрыми — потому что они для проверки целостности файлов, где важна скорость. Но для паролей скорость — это плохо.
Если один алгоритм считает 10 миллиардов хешей в секунду, а другой — 1000, то перебор одного и того же пароля займёт в первом случае минуты, во втором — века. Специально для паролей придумали «медленные» алгоритмы: bcrypt, scrypt, Argon2.
Быстрый, компактный. Использовался для хеширования паролей в 90-х и нулевых. Сегодня категорически не годится — сломан, есть коллизии, есть готовые таблицы.
Стандарт криптографии — но именно потому, что он быстрый. Для хеширования пароля SHA-256 надо использовать только с солью и много раз (key stretching). Иначе перебор идёт слишком быстро.
Специально медленный. Можно настроить «стоимость» — сколько раз алгоритм прогоняет себя. Каждое удвоение стоимости удваивает время. Соль встроена в bcrypt по умолчанию.
Если вы делаете сайт или приложение, эти правила — обязательный минимум. Если вы просто пользователь — они объясняют, почему «забудьте пароль» — это нормально.
Это база. Даже не «временно», даже не «для отладки». Взлом базы с открытыми паролями — катастрофа.
Соль должна быть уникальной для каждого пользователя и генерироваться криптографически стойким генератором.
bcrypt, scrypt, Argon2. MD5 и SHA-256 без key stretching — не годятся для паролей.
Параметр cost — 2^cost итераций. В 2024 году разумный минимум — cost=12 (4096 итераций).
Её можно хранить рядом с хешем в одной строке, как делает bcrypt. Задача соли — не скрыть пароль, а сделать каждый хеш уникальным.
Если старые пароли хешированы MD5, при следующем входе пользователя посчитайте заново под bcrypt. Постепенно все обновятся.