Пароли не хранятся в базе данных. Ни один нормальный сервис не держит твой qwerty123 в открытом виде — вместо пароля хранится его необратимый «отпечаток» (хеш) плюс случайная добавка (соль). Даже при утечке базы достать исходные пароли нельзя, можно только медленно подбирать.

TL;DR

  • В базе лежит не пароль, а его хеш — односторонняя функция: из хеша пароль не восстановить.
  • Соль — уникальная случайная строка на каждого пользователя. Она ломает массовый подбор: одинаковые пароли дают разные хеши.
  • Алгоритм специально медленный (bcrypt, Argon2). Для пользователя это 100 мс, для перебора миллиардов вариантов — годы.
  • MD5 и SHA для паролей не годятся: слишком быстрые, перебор идёт миллиардами в секунду.

Что такое хеш?

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

password123ef92b778..., а password124a1b2c3d4... — совсем другой. Изменил один символ — хеш изменился полностью. Поэтому сервер при входе не «расшифровывает» пароль, а считает хеш заново и сравнивает с сохранённым.

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

Если у тысячи пользователей пароль password123 — у всех будет одинаковый хеш. Взломал один — взломал всех, и базы готовых хешей (rainbow tables) делают это мгновенно.

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

password123 + x7Ks9pLm8f4a2b1c...
password123 + Qw3rTy5zd9e8f7a6...

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

Почему медленный алгоритм — это хорошо?

MD5 устарел: видеокарта перебирает ~40 млрд хешей в секунду, пароль из 8 символов ломается за минуты. bcrypt сделан для паролей и встроенно замедлен — ~30 тыс хешей в секунду, разница в миллион раз. Argon2 — современный стандарт: жрёт много памяти, чем убивает перебор на GPU.

Медленный алгоритм — это фича. Пользователь ждёт 100 мс при входе и не замечает. Злоумышленник при переборе миллиарда вариантов ждёт годы.

Как это работает по шагам?

Регистрация. Пароль прилетает по HTTPS в теле POST-запроса (не в URL — там он попал бы в логи). Сервер генерирует соль, считает хеш, сохраняет в базу соль и хеш. Сам пароль не сохраняется нигде.

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

Что это значит для аналитика?

Когда пишешь требования к авторизации, за строчкой «пользователь может войти» стоит конкретная инженерная логика: какой алгоритм хеширования, где хранится соль, как пароль доходит до сервера, что в логи писать нельзя. Это часть более широкой темы — аутентификации и авторизации. А пароль — это лишь первый фактор: почему одного его мало и какие бывают вторые, разобрано в записи про двухфакторную аутентификацию.