Вопрос или проблема
Из других алгоритмов хеширования паролей я знаю, что когда пользователь пытается войти в систему, и учетная запись не существует изначально, лучшей практикой является хеширование предоставленного пароля, чтобы не раскрывать информацию о том, является ли имя пользователя действительным или нет. Некоторые библиотеки даже предоставляли методы специально для этой цели.
Однако, при рассмотрении Argon2id, ни один из примеров кода до сих пор не реализовал это поведение. Например, шаблон старта SaaS от loco-rs просто возвращает, когда аккаунт не может быть найден.
Это упущение в примерах или это просто не требуется для Argon2id?
Способность измерить разницу во времени между выполнением хеширования пароля для проверки и отсутствием его выполнения не имеет ничего общего с конкретным алгоритмом хеширования пароля, который используется – все они медленны по замыслу.
Таким образом, если для вашего случая важно, чтобы злоумышленники не могли выяснить, существует ли пользователь (что неизвестно, является ли это частью ваших сценариев угроз), то вы должны убедиться, что выполняете хеширование или реализовать какой-то сопоставимый задержанный ответ, даже если пользователя не существует.
Ответ или решение
Нужно ли защищать систему авторизации от атак с помощью измерения времени при использовании Argon2id?
При реализации систем авторизации, особенно в контексте работы с паролями, стоит учитывать возможность атак с помощью измерения времени. Ключевым моментом здесь является то, что независимо от алгоритма хеширования, например, Argon2id, существует риск утечки информации о существовании учетной записи на основе временных задержек при обработке запросов.
1. Описание проблемы
Когда пользователь пытается войти в систему, традиционно рекомендуется сжимать время, затрачиваемое на выполнение задач при ответе на запросы, связанные с проверкой имени пользователя и пароля. В случае, если задано неверное имя пользователя, не следует сообщать об этом факте. Тем не менее, если ваше приложение не равномерно обрабатывает запросы для существующих и несуществующих учетных записей, злоумышленник может заметить разницу во времени выполнения и, соответственно, сделать вывод о том, существует ли учетная запись.
2. Простая реализация Argon2id
Argon2id, как уже было упомянуто, является алгоритмом, разработанным с учетом безопасности и медлительности, что уж сильно затрудняет его использование в реальных условиях для атак в реальном времени. Однако, это не исключает необходимости иметь элементы защиты от атак через временные различия.
3. Как защититься от временных атак?
Для повышения безопасности вы можете использовать следующие подходы:
-
Унифицированное время выполнения: Обязательно хешируйте предоставленный пароль, даже если вы знаете, что имя пользователя неверно. Это позволит вам значительно уменьшить вероятность утечки информации.
-
Искусственная задержка: Если внутреннее время обработки хеширования пароля слишком короткое, вы можете добавить фиксированную временную задержку к вашей логике, чтобы сделать время выполнения запроса более равномерным, даже если имя пользователя неверно.
-
Обработка параллельно: Возможность применять обработку запросов в параллельном режиме может также уменьшить риски, так как затраты времени не будут явно представлены внешнему наблюдателю.
-
Логи и мониторинг: Ведение детальных логов попыток входа в систему и их успехов может помочь выявить возможные атаки и аномальное поведение.
4. Заключение
Хотя использование Argon2id дает вам более безопасный хеш для хранения паролей, ваше приложение должно быть спроектировано с учетом общей архитектуры безопасности. Защита от атак через измерение времени — это неотъемлемая часть создания качественной системы аутентификации. Рекомендуется всегда шифровать пароли и использовать временные задержки, чтобы не допустить утечку информации о состоянии учетной записи. Ваши методы защиты должны соответствовать угрозам, с которыми вы можете столкнуться, чтобы обеспечить высокий уровень безопасности для ваших пользователей.