Пароли не хранятся в базе данных. Ни один нормальный сервис не держит твой qwerty123 в открытом виде — вместо пароля хранится его необратимый «отпечаток» (хеш) плюс случайная добавка (соль). Даже при утечке базы достать исходные пароли нельзя, можно только медленно подбирать.
TL;DR
- В базе лежит не пароль, а его хеш — односторонняя функция: из хеша пароль не восстановить.
- Соль — уникальная случайная строка на каждого пользователя. Она ломает массовый подбор: одинаковые пароли дают разные хеши.
- Алгоритм специально медленный (
bcrypt,Argon2). Для пользователя это 100 мс, для перебора миллиардов вариантов — годы. MD5иSHAдля паролей не годятся: слишком быстрые, перебор идёт миллиардами в секунду.
Что такое хеш?
Хеш-функция превращает любой текст в строку фиксированной длины. Главное свойство — односторонность: из хеша нельзя получить исходный пароль, можно только подбирать варианты и сравнивать.
password123 → ef92b778..., а password124 → a1b2c3d4... — совсем другой. Изменил один символ — хеш изменился полностью. Поэтому сервер при входе не «расшифровывает» пароль, а считает хеш заново и сравнивает с сохранённым.
Зачем нужна соль?
Если у тысячи пользователей пароль password123 — у всех будет одинаковый хеш. Взломал один — взломал всех, и базы готовых хешей (rainbow tables) делают это мгновенно.
Соль — случайная строка, уникальная для каждого пользователя, она подмешивается к паролю перед хешированием:
password123 + x7Ks9pLm → 8f4a2b1c...password123 + Qw3rTy5z → d9e8f7a6...
Тот же пароль — разные хеши. Теперь каждый пароль нужно подбирать отдельно, и готовые таблицы бесполезны.
Почему медленный алгоритм — это хорошо?
MD5 устарел: видеокарта перебирает ~40 млрд хешей в секунду, пароль из 8 символов ломается за минуты. bcrypt сделан для паролей и встроенно замедлен — ~30 тыс хешей в секунду, разница в миллион раз. Argon2 — современный стандарт: жрёт много памяти, чем убивает перебор на GPU.
Медленный алгоритм — это фича. Пользователь ждёт 100 мс при входе и не замечает. Злоумышленник при переборе миллиарда вариантов ждёт годы.
Как это работает по шагам?
Регистрация. Пароль прилетает по HTTPS в теле POST-запроса (не в URL — там он попал бы в логи). Сервер генерирует соль, считает хеш, сохраняет в базу соль и хеш. Сам пароль не сохраняется нигде.
Вход. Сервер достаёт соль и хеш из базы, считает хеш введённого пароля с той же солью и сравнивает. Совпало — пускает.
Что это значит для аналитика?
Когда пишешь требования к авторизации, за строчкой «пользователь может войти» стоит конкретная инженерная логика: какой алгоритм хеширования, где хранится соль, как пароль доходит до сервера, что в логи писать нельзя. Это часть более широкой темы — аутентификации и авторизации. А пароль — это лишь первый фактор: почему одного его мало и какие бывают вторые, разобрано в записи про двухфакторную аутентификацию.