Почему сайты не знают пароли своих пользователей

Все мы люди современные, а поэтому у каждого из нас десятки, если не сотни, аккаунтов на всевозможных сайтах и сервисах. И нередко эти пароли теряются или забываются. Поэтому, каждый рано или поздно столкнётся или уже сталкивался с восстановлением пароля.

Почему сайты не знают пароли своих пользователей

Главное заблуждение людей на этот счёт в том, что сайты знают наши пароли и могут просто прислать их нам. Поэтому покажу прямо и на примере то, как пароли хранятся в базах большинства сайтов. Итак, давайте создадим аккаунт с именем example и паролем 123456. Если заглянуть внутрь базы данных сервера, то в поле пароля будет хранится, на первый взгляд, несвязный набор символов e10adc3949ba59abbe56e057f20f883e. Почему же так происходит? Во всём виновата математика, но обо всём по порядку.

Почему сайты не знают пароли своих пользователей

Хэш-функция

Первое, что необходимо усвоить, это определение хэш-функции. Это такой алгоритм, который из любой последовательности символов, создает другую последовательность символов фиксированной длины. Звучит не очень просто, поэтому покажу на примере самой популярной хэш-функции md5 (на самом деле таких функций очень много, а сама md5 уже давно не используется. Но принцип у всех один).

  • 123456 -> e10adc3949ba59abbe56e057f20f883e
  • Привет мир -> 79d636ccef972a9d10db69750cd53e8b
  • Яндекс дзен -> c105e6481a177454e4bb79b5930d04c3

Вы можете попробовать сделать это сами.

Итак, к какой бы строке мы не применили этот алгоритм, получаем другую строку длиной в 32 символа. Основной смысл любой хэш-функции в том, что преобразование в одну сторону происходит быстро, а обратно это сделать почти невозможно (Для хорошей хэш функции подходит только полный перебор).

Уязвимость человек по середине

Зачем хранить пароль, если можно просто хранить его хэш. И всё сразу становится безопасненько. Но всё не совсем радужно, как нам хотелось бы. Усть уязвимость, которая называется человек по середине. Она заключается в том, что в любой момент времени можно перехватить все данные, которые отправляются по сети интернет, если находиться между сервером и жертвой. То есть не важно, передаётся пароль или хэш. Если злоумышленник перехватит это хотя бы один раз, он сможет иметь полный доступ к аккаунту. Эту проблему надо как-то решать, и её решение назвали соль.

Итак, соль - случайная последовательность символов, которую добавляют к паролю, чтобы предотвратить атаку человек по середине. Покажу на примере.

  1. Наш пароль 123456.
  2. После преобразования через хэш-функцию превращается в e10adc3949ba59abbe56e057f20f883e.
  3. Попросим сервер прислать нам соль. Пусть это будет 789
  4. Добавляем эту соль к хэшу, и получаем: e10adc3949ba59abbe56e057f20f883e789
  5. Находим хэш от новой строки: c17151c401b58ca00e470dfb36e22372
  6. Получившийся хэш отправляем на сервер

Теперь посмотрим как это происходит внутри сервера. Сервер не знает пароля пользователя, но знает его хэш: e10adc3949ba59abbe56e057f20f883e

  1. Сервер генерирует случайные числа, называемые солью: 789
  2. Сервер добавляет эту соль к своему хэшу. И получается: e10adc3949ba59abbe56e057f20f883e789
  3. Сервер находит хэш от новой строки: c17151c401b58ca00e470dfb36e22372
  4. Сервер получает от клиента клиентских хэш и сверяет его со своим.

Вот такими сложными путями происходит простейший процесс входа в свой аккаунт, который мы повторяем по нескольку раз в день.

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

Почему сайты не знают пароли своих пользователей

Только что я описал вам самый простой способ хранения паролей, который используется в большинстве интернет-ресурсах. Естественно, есть много других, но я описал именно основной алгоритм, который является необходимым минимумом для того, чтобы обезопасить личные данные пользователей.