Все мы люди современные, а поэтому у каждого из нас десятки, если не сотни, аккаунтов на всевозможных сайтах и сервисах. И нередко эти пароли теряются или забываются. Поэтому, каждый рано или поздно столкнётся или уже сталкивался с восстановлением пароля.
Главное заблуждение людей на этот счёт в том, что сайты знают наши пароли и могут просто прислать их нам. Поэтому покажу прямо и на примере то, как пароли хранятся в базах большинства сайтов. Итак, давайте создадим аккаунт с именем example и паролем 123456. Если заглянуть внутрь базы данных сервера, то в поле пароля будет хранится, на первый взгляд, несвязный набор символов e10adc3949ba59abbe56e057f20f883e. Почему же так происходит? Во всём виновата математика, но обо всём по порядку.
Хэш-функция
Первое, что необходимо усвоить, это определение хэш-функции. Это такой алгоритм, который из любой последовательности символов, создает другую последовательность символов фиксированной длины. Звучит не очень просто, поэтому покажу на примере самой популярной хэш-функции md5 (на самом деле таких функций очень много, а сама md5 уже давно не используется. Но принцип у всех один).
- 123456 -> e10adc3949ba59abbe56e057f20f883e
- Привет мир -> 79d636ccef972a9d10db69750cd53e8b
- Яндекс дзен -> c105e6481a177454e4bb79b5930d04c3
Вы можете попробовать сделать это сами.
Итак, к какой бы строке мы не применили этот алгоритм, получаем другую строку длиной в 32 символа. Основной смысл любой хэш-функции в том, что преобразование в одну сторону происходит быстро, а обратно это сделать почти невозможно (Для хорошей хэш функции подходит только полный перебор).
Уязвимость человек по середине
Зачем хранить пароль, если можно просто хранить его хэш. И всё сразу становится безопасненько. Но всё не совсем радужно, как нам хотелось бы. Усть уязвимость, которая называется человек по середине. Она заключается в том, что в любой момент времени можно перехватить все данные, которые отправляются по сети интернет, если находиться между сервером и жертвой. То есть не важно, передаётся пароль или хэш. Если злоумышленник перехватит это хотя бы один раз, он сможет иметь полный доступ к аккаунту. Эту проблему надо как-то решать, и её решение назвали соль.
Итак, соль - случайная последовательность символов, которую добавляют к паролю, чтобы предотвратить атаку человек по середине. Покажу на примере.
- Наш пароль 123456.
- После преобразования через хэш-функцию превращается в e10adc3949ba59abbe56e057f20f883e.
- Попросим сервер прислать нам соль. Пусть это будет 789
- Добавляем эту соль к хэшу, и получаем: e10adc3949ba59abbe56e057f20f883e789
- Находим хэш от новой строки: c17151c401b58ca00e470dfb36e22372
- Получившийся хэш отправляем на сервер
Теперь посмотрим как это происходит внутри сервера. Сервер не знает пароля пользователя, но знает его хэш: e10adc3949ba59abbe56e057f20f883e
- Сервер генерирует случайные числа, называемые солью: 789
- Сервер добавляет эту соль к своему хэшу. И получается: e10adc3949ba59abbe56e057f20f883e789
- Сервер находит хэш от новой строки: c17151c401b58ca00e470dfb36e22372
- Сервер получает от клиента клиентских хэш и сверяет его со своим.
Вот такими сложными путями происходит простейший процесс входа в свой аккаунт, который мы повторяем по нескольку раз в день.
Для чего же это всё делается? Основная причина в том, что каждый раз через сеть будут передаваться разные наборы символов, поэтому перехватить их и что-либо узнать будет почти невозможно.
Только что я описал вам самый простой способ хранения паролей, который используется в большинстве интернет-ресурсах. Естественно, есть много других, но я описал именно основной алгоритм, который является необходимым минимумом для того, чтобы обезопасить личные данные пользователей.