✨ Интерактивный разбор

Соль под микроскопом

Соль — это одна случайная строка, которую добавляют к паролю перед хешированием. Звучит как мелочь. Но именно она спасает миллиарды паролей от мгновенного взлома. У всех пользователей с паролем «qwerty» будут разные хеши. Сейчас покажем почему.

Один пароль — два хеша с солью
Юзер 1 «qwerty» + a8f2 → 3b19f7...
Юзер 2 «qwerty» + 9c4e → f2a8b1...

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

1 Проблема

Что не так с хешем без соли

Напомню коротко: на сервере пароли не хранят в открытом виде — хранят их хеш. Это уже хорошо. Но есть две проблемы, которые делают хеш без соли уязвимым:

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

Без соли

Три пользователя с паролем «qwerty»

Все три хеша одинаковые. Взломщик видит это и понимает — у всех один пароль. И один раз подобрав его, он получает доступ к трём аккаунтам сразу.

Анна
пароль: qwerty
хеш: 5d41402abc4b2a76b9719d911017c592
Борис
пароль: qwerty
хеш: 5d41402abc4b2a76b9719d911017c592
Виктор
пароль: qwerty
хеш: 5d41402abc4b2a76b9719d911017c592
⚠️ Один подобранный пароль → три взломанных аккаунта
С солью

Те же три пользователя

К каждому паролю добавили случайную строку. Хеши разные — как будто пароли вообще разные. Взломщик даже не узнает, что все трое использовали «qwerty».

Анна
пароль: qwerty + a8f2
хеш: 3b19f7c4e2a88d5f...
Борис
пароль: qwerty + 9c4e
хеш: f2a8b1d93e6c7a10...
Виктор
пароль: qwerty + 72bd
хеш: 8e5c91a2f4d7b3e6...
✓ Три разных хеша → три отдельных взлома
2 Радужная таблица

Как соль ломает атаку за секунду

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

Радужная таблица MD5 Топ-30 самых популярных паролей
🎯 Хеш 5d41402abc4b2a76b9719d911017c592 найден в таблице. Пароль — qwerty. Найдено за 1 миллисекунду.
3 Симулятор регистрации

Как соль применяется на практике

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

4 Алгоритмы

MD5, SHA-256 и bcrypt — три разных подхода

Соль — только половина решения. Вторая половина — алгоритм. MD5 и SHA-256 спроектированы быть быстрыми — потому что они для проверки целостности файлов, где важна скорость. Но для паролей скорость — это плохо.

Если один алгоритм считает 10 миллиардов хешей в секунду, а другой — 1000, то перебор одного и того же пароля займёт в первом случае минуты, во втором — века. Специально для паролей придумали «медленные» алгоритмы: bcrypt, scrypt, Argon2.

Не для паролей

MD5

Message Digest 5, 1991

Быстрый, компактный. Использовался для хеширования паролей в 90-х и нулевых. Сегодня категорически не годится — сломан, есть коллизии, есть готовые таблицы.

Скорость~10 млрд/с
Длина128 бит
Коллизиинайдены в 2004
Быстро, но не идеально

SHA-256

Secure Hash Algorithm, 2001

Стандарт криптографии — но именно потому, что он быстрый. Для хеширования пароля SHA-256 надо использовать только с солью и много раз (key stretching). Иначе перебор идёт слишком быстро.

Скорость~1 млрд/с
Длина256 бит
Коллизиине найдены
Стандарт для паролей

bcrypt

Blowfish crypt, 1999

Специально медленный. Можно настроить «стоимость» — сколько раз алгоритм прогоняет себя. Каждое удвоение стоимости удваивает время. Соль встроена в bcrypt по умолчанию.

Скорость~10 тыс/с
Длина184 бита
Сольвстроена
5 Правила

Как правильно хранить пароли

Если вы делаете сайт или приложение, эти правила — обязательный минимум. Если вы просто пользователь — они объясняют, почему «забудьте пароль» — это нормально.

🔐

Никогда не храните пароли в открытом виде

Это база. Даже не «временно», даже не «для отладки». Взлом базы с открытыми паролями — катастрофа.

🧂

Всегда используйте соль

Соль должна быть уникальной для каждого пользователя и генерироваться криптографически стойким генератором.

🐢

Используйте медленные алгоритмы

bcrypt, scrypt, Argon2. MD5 и SHA-256 без key stretching — не годятся для паролей.

⚙️

Настраивайте «стоимость» bcrypt

Параметр cost — 2^cost итераций. В 2024 году разумный минимум — cost=12 (4096 итераций).

📏

Соль не секрет

Её можно хранить рядом с хешем в одной строке, как делает bcrypt. Задача соли — не скрыть пароль, а сделать каждый хеш уникальным.

🔁

Периодически обновляйте алгоритм

Если старые пароли хешированы MD5, при следующем входе пользователя посчитайте заново под bcrypt. Постепенно все обновятся.