Почему пароли хранят не в открытом виде: магия хеширования
Представь: огромный сайт взломали, базу данных украли — а пароли всё равно остались в безопасности. Как такое возможно? Секрет в хитром математическом фокусе под названием хеширование.
Представь, что злоумышленники украли у крупного сайта всю базу данных с миллионами аккаунтов. Звучит как катастрофа? А вот и нет: если сайт сделал всё правильно, твой пароль по-прежнему в безопасности. Всё благодаря фокусу, который называют хешированием — и сейчас ты поймёшь, как он работает.
Главное правило: сайт не знает твой пароль
Звучит странно, правда? Ты вводишь пароль, сайт пускает тебя внутрь — значит, он его знает? На самом деле нет. Серьёзные сервисы никогда не хранят пароли в открытом виде, то есть так, как ты их набираешь. Если бы хранили, то любой сотрудник или хакер, заглянувший в базу данных, сразу увидел бы строчку вроде «Ваня — qwerty123» и спокойно зашёл бы в твой аккаунт.
Вместо этого сайт хранит не сам пароль, а его хеш — особый «отпечаток». Когда ты регистрируешься, твой пароль прогоняют через специальную функцию, и она выдаёт длинную строку из букв и цифр. Вот так пароль password превращается во что-то вроде 5f4dcc3b5aa765d61d8327deb882cf99. Именно эта абракадабра и попадает в базу — а не сам пароль.
Что такое хеш-функция
Хеш-функция — это математический «мясорубка». Ты кладёшь в неё что угодно: одно слово, целую книгу, фотографию — а на выходе всегда получаешь строку фиксированной длины. У неё есть три волшебных свойства, которые и делают её полезной для паролей:
- Одинаковый вход — одинаковый выход. Слово cat всегда даёт один и тот же хеш. Иначе сайт не смог бы тебя узнать при следующем входе.
- Чуть изменил вход — выход полностью другой. Поменяй одну букву, и хеш изменится до неузнаваемости. cat и Cat дают совершенно разные отпечатки, без всякого сходства.
- Назад дороги нет. Зная хеш, практически невозможно вычислить, какой пароль его породил.
Вот это последнее свойство — самое важное. Хеширование работает только в одну сторону.
Почему хеш нельзя «расшифровать»
Представь, что ты взял яблоко, банан и киви и сделал из них смузи. Получился вкусный напиток. А теперь попробуй из стакана смузи вернуть обратно целое яблоко, целый банан и киви. Не выйдет, верно? Информация о том, как фрукты выглядели, безвозвратно перемешалась.
С хешем то же самое. Это не шифрование, где есть ключ, чтобы вернуть всё назад. Это необратимое перемешивание. Когда ты в следующий раз вводишь пароль, сайт не расшифровывает хеш из базы. Он берёт твой свежий пароль, снова прогоняет его через ту же мясорубку и просто сравнивает два смузи: если новый хеш совпал с тем, что лежит в базе — пароль верный, заходи.
Сайт не хранит твой пароль. Он хранит доказательство того, что ты его знаешь — и сравнивает доказательства, а не сами пароли.
Поэтому, кстати, нормальный сервис никогда не пришлёт тебе твой старый пароль на почту. Он его попросту не знает! Он может только предложить придумать новый.
Соль: почему два одинаковых пароля выглядят по-разному
Но у хакеров есть хитрость. Раз одинаковый пароль всегда даёт одинаковый хеш, можно заранее посчитать хеши для миллионов популярных паролей и сложить в огромный словарь. Украл базу, сравнил хеши со словарём — и часть паролей разгадана. Особенно легко с теми, кто ставит 123456 или qwerty.
Чтобы этот трюк не работал, придумали соль (по-английски salt). Перед хешированием к твоему паролю подмешивают случайную добавку — уникальную для каждого пользователя. Получается, что даже если вы с другом выбрали один и тот же пароль, в базе ваши хеши будут совершенно разными, потому что соль у каждого своя. Заранее заготовленный словарь становится бесполезным: хакеру пришлось бы пересчитывать всё заново для каждой соли по отдельности.
Это как если бы пекарь добавлял в каждую буханку щепотку специй по секретному, всякий раз новому рецепту. Даже два одинаковых на вид хлеба внутри окажутся разными.
Что это значит лично для тебя
Хеширование защищает базу данных, но оно не спасёт слабый пароль. Если ты поставил 12345, хакер угадает его перебором за доли секунды — никакая соль не поможет, ведь сам пароль очевиден. Поэтому твоя часть сделки такая:
- Делай пароли длинными — лучше целую фразу из нескольких слов, чем короткую мешанину символов.
- Не используй один и тот же пароль везде. Утечёт один сайт — пострадают все твои аккаунты сразу.
- Подключи двухфакторную аутентификацию, где это можно: тогда даже зная пароль, без кода с твоего телефона внутрь не попасть.
Так что в следующий раз, когда увидишь новость «утекла база на миллион аккаунтов», ты будешь знать главное: если сайт хешировал пароли с солью, у злоумышленников оказался не список паролей, а гора бесполезного цифрового смузи. И в этом — вся скромная магия хеширования.