Найти тему

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

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

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

-2

Хэш-функция

Первое, что необходимо усвоить, это определение хэш-функции. Это такой алгоритм, который из любой последовательности символов, создает другую последовательность символов фиксированной длины. Звучит не очень просто, поэтому покажу на примере самой популярной хэш-функции 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. Сервер получает от клиента клиентских хэш и сверяет его со своим.

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

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

-3

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