Как сайты хранят пароли

Защита

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

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

Хеш вместо пароля

Правильный сервис не хранит пароль. Он хранит хеш — результат необратимого преобразования: из пароля хеш получить легко, из хеша пароль — нельзя.

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

Отсюда первый практический вывод. Если сервис умеет прислать вам ваш пароль — не ссылку на смену, а именно пароль, — значит он хранит его в открытом виде или в обратимом шифровании. Это красный флаг: при взломе базы утекут все пароли сразу, готовые к использованию.

10млрд/с
Столько быстрых хешей проверяет одна видеокарта

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

Зачем нужна соль

Одного хеширования мало. Одинаковые пароли дают одинаковые хеши, а значит по базе видно, у кого пароли совпадают. Хуже того: существуют готовые таблицы, где для миллиардов популярных паролей хеши уже посчитаны — поиск по такой таблице мгновенный.

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

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

Почему хорошая функция — медленная

Контринтуитивная часть. Обычные хеш-функции вроде SHA-256 создавались быстрыми — это нужно для проверки файлов и подписей. Для паролей быстрота вредна: видеокарта считает миллиарды SHA-256 в секунду, и перебор идёт с той же скоростью.

Поэтому для паролей применяют намеренно медленные функции: bcrypt, scrypt, Argon2. У них есть параметр сложности, который поднимают по мере роста мощности железа. Один вход занимает у сервера доли секунды — незаметно для человека. Перебор при этом замедляется в тысячи раз.

Argon2 идёт дальше и требует ещё и много памяти. Это бьёт по видеокартам: у них много вычислительных ядер, но мало памяти на каждое, и преимущество в переборе исчезает.

Что утекает при взломе базы

Разница между вариантами хранения видна именно здесь.

Открытый текст. Утекают все пароли, готовые к использованию. Ваш пароль немедленно пробуют на почте и в банке.

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

Быстрый хеш с солью. Заметно лучше, но видеокарта перебирает миллиарды вариантов в секунду. Слабые пароли падают за часы, средние — за дни.

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

Обратите внимание: в последних двух строчках всё зависит уже от вас. Правильное хранение защищает надёжный пароль, но не спасает «Лето2026!».

Как понять, что сервис хранит пароли плохо

Изнутри не видно, но есть признаки, заметные снаружи.

Присылает пароль в письме при регистрации или восстановлении — хранит открыто.

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

Запрещает спецсимволы. Отдельно это не доказательство, но в сочетании с предыдущим — устойчивый признак старого кода, где пароль подставляется в запрос как есть.

Показывает при восстановлении подсказку с частью пароля — значит пароль доступен серверу в читаемом виде.

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

Скопировано