Я всегда хотел, чтобы хакер не смог взломать чужой пароль на сайте.
Например, если пользователь хвастается, что его пароль состоит только из цифр, то вскоре пользователь потеряет свою учетную запись.Но что, если пользователь по телефону сообщил жене свой пароль, и хакер его услышал?Что?! Знает ли хакер пароль? Все это провал. Можете ли вы помочь этому пользователю затруднить захват его учетной записи? Меня всегда волновал этот вопрос, и я думаю, что нашел способ сделать это. Или заново открыл ее, как это часто бывает. Ведь все придумано задолго до нас.Вот как будет выглядеть защита пароля.
Как работает метод? Вся конкретика — под катом.
Разрешите пользователю иметь пароль «12345», и взлом этого пароля должен быть затруднен. Например, как угадать пароль, похожий на хэш.
Представьте, если бы в браузере всегда была уникальная соль, которой можно было солить пароль. Каждому пользователю по соли. Зачем она нужна? Чтобы шифровать. Например, если зашифровать строку «12345» с солью «saltsalt» в argon2id, то получится «$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg». Поменяй соль — и хэш будет другим. Один алгоритм зашифрует одинаковые пароли по-разному, если использовать разную соль для каждого. Годится.
Но где взять эту соль? Да, вот она сидит перед монитором. Пусть выдавит еще два-три символа и наконец-то по человечески подключится. Ну, пусть будет cat. Что такое cat? Это наше секретное слово. Мы отправим его на сервер во время регистрации, и он будет генерировать соль для этого слова. А потом он пришлет нам эту соль. Вот и все — в браузере есть соль. Теперь пароль. А еще мы шифруем пароль и лаунджи солью, которую прислал сервер.
Теперь мы не шлем «12345». Мы шлем хэш, и так-как у каждого пользователя своя соль, хэш получается разный.
Кажется, брутфорсу сейчас поплохеет: мало того, что придется делать дополнительные вычисления и перебирать длинные строки хэшей аргона вместо простых цифр, так еще и у каждого пользователя будет свой хэш — теперь бесполезно пробовать одну и ту же строку в виде пароля для проверки ее у всех пользователей. Допустим, три пользователя выбрали один и тот же пароль: 12345. Но хэш у них получится разный. Потому что у каждого разная соль.
То есть, для защиты своего простого пароля, пользователь должен придумать еще одно очень простое слово. Он вводит это слово везде, где хочет пройти аутентификацию, а потом потребуется вводить только пароль. Пока он не почистит куки.
Пароль и секретное слово могут быть очень простыми. Один или два символа. Например, пароль 12345 и секретное слово 42. И если кто-то еще придумает секретное слово 42, то это будет не страшно.
У нас есть следующие элементы:
Далее нам понадобятся два разных алгоритма, которые могут быть реализованы даже на одной шифровальной системе просто с разными параметрами:
Кроме того, нам понадобится еще два алгоритма попроще:
Cервер проверяет и удостоверяется, что пользователь alice отсутствует в БД.
Сервер вычисляет следующие значения:
$salt_unique_for_each_user = ALG_SALT(); // строка "saltsalt"
$salt_for_password = ALG1("cat", $salt_unique_for_each_user); // строка "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
$user_simple_password = ALG_PASS(); // строка "12345"
$user_simple_password_hashed = ALG2($user_simple_password , $salt_for_password); // строка "$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ"
Сервер создает в таблице пользователей запись и сохраняет данные:
INSERT INTO `users`
(
login,
password_hashed,
salt_unique_for_each_user,
salt_for_password
)
VALUES
(
"alice",
"$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ",
"saltsalt",
"$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
).
Наш сервер показывает пользователю страницу успеха регистрации с сообщением: «Пользователь alice успешно создан. Используйте временный пароль 12345 для входа.»
Пользователь радостно кричит: “Ура, я зарегистрировался на сайте site под ником alice и мне дали пароль 12345. Какой смешной и простой пароль!“. Но у квартиры пользователя очень плохая звукоизоляция, и его хакер-сосед все услышал.
Хакер озадачен. Пока оставим его.
Теперь сервер получает запрос и видит, что вместо пароля прислали секретное слово.
Пояснение: Сервер никак не уведомляет какая соль была отправлена — правильная или нет. Результат ее использования будет ясен, когда с ней попытаются авторизоваться с правильными логином и паролем.
login = alice, salt = "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg".
hashed = ALG2(«12345», "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg")
.«alice»/$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ,
а сам пароль 12345 никуда не шлет.Сервер получает запрос на аутентификацию:
Примечание. В моем примере сервер сравнивает хэши напрямую. Но невозможно сохранить в базе данных строки, которые на самом деле уже являются паролями. Их можно украсть, а затем использовать в виде пароля для входа. Поэтому необходимо хешировать хеши, как бы это ни казалось странным. Это означает, что вам понадобится третья соль. Но хранить его нужно не в базе данных, а в переменной окружения. Однако это уже детали реализации, которые я упустил для простоты.
Тем временем наш хакер решает проверить эту странную форму входа:
Сервер отсылает вычисленное значение соли обратно в браузер пользователя. В заголовках указано — `установить куку salt = $result_fake_salt`. Также сохраняется и логин: `установить куку login = «alice»`.
Пояснение: Чтобы помочь хакеру в деле нелегкого труда, сервер отправляет ему соль. Но определить со стороны: правильное ли было секретное слово или нет — невозможно.
Сервер получает запрос на аутентификацию — «alice»/$password_hashed.
Идет в БД, достает значение `password_hashed` -> $db_password_hashed.
Сравнивает: $password_hashed === $db_password_hashed? Nope.
Хэши этих изначально одинаковых паролей не совпадают. Потому что их солили по-разному.
Хакер не сдается и идет регистрировать другого пользователя на сайте.
Совершенно случайно он вводит то же самое секретное слово, что и пользователь за стеной — cat.
Хакер получает валидную соль для пароля к новому аккаунту, и пробует ее подставить в скрипт для хэширования.
К счастью, при генерации соли пароля использовалась вторая соль (`salt_unique_for_each_user`), которая генерируется по-новому для каждого пользователя. Таким образом, у разных пользователей, даже с одними и теми же паролями и, что наиболее важно, секретными словами, будут разные соли. И соль пользователя с тем же секретным словом не будет соответствовать соли другого пользователя. И сопоставление пароля тоже не будет проблемой.
Теперь, что касается усложнения перебора паролей по словарю. Если мы модифицируем ALG2, который является общим и для сервера и для клиента, и сделаем его трудозатратным, это серьезно осложнит перебор для хакера. Напомню, ALG2 это процесс получения хэша пароля, который отправляется на сервер. На сервере этот хэш уже вычислен и хранится в БД:
На слабых машинах операция может выполняться значительно дольше, чем на быстрых. Это может стать проблемой. Так что можно не делать усложнение алгоритма.
Завершу описание концепта бочкой дегтя:
… и ложкой меда:
Возможно, вы думаете, что атаки методом перебора вас не беспокоят, потому что ваш небольшой и не очень популярный сайт не интересует хакеров. Мы обязаны сообщить вам, что это уже не так. Любой ресурс в сети подвергается многочисленным постоянным атакам. Целью таких атак является не сам сайт, а ресурсы сервера, на котором он размещен: взломанный сайт превращается в сайт для размещения вирусов, рассылки спама, фишинга, майнинга криптовалюты и т. Д. Следовательно, защита админ-панели любого сайта является обязательной. В противном случае рано или поздно доступ будет скомпрометирован.
Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…
Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…
Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…
С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…
Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…
Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…