Пароли, токены и многофакторная аутентификация
Криптография и инфраструктура открытых ключейКак проектировать аутентификацию: хранение паролей, токены сессий, JWT и многофакторность.
Зачем это нужно
- Аутентификация — самая частая точка отказа в реальных инцидентах.
- Ошибки в токенах и сессиях встречаются почти в каждом аудите веб-приложений.
- Правильная многофакторность отличает защиту от её имитации.
Теория
Пароли хранят в виде медленных хешей с солью (Argon2 предпочтительно). Проверять нужно так, чтобы не раскрывать существование учётной записи, ограничивать частоту попыток, включить блокировки, а также сверяться с базами утечек для предотвращения повторного использования. Смена пароля должна инвалидировать активные сессии, а сброс — использовать одноразовые токены с ограниченным сроком.
Сессии и токены: серверный сеанс с идентификатором в защищённой cookie — простая и надёжная схема; JWT применяется для передачи утверждений между сервисами, но при неправильном использовании создаёт проблемы: отсутствие проверки подписи, алгоритм «none», доверие полю с алгоритмом из токена, слишком длинные сроки жизни, отсутствие отзыва. Безопасные практики: фиксированный алгоритм и ключи, обязательная проверка всех полей, короткие сроки и механизм обновления, хранение токенов так, чтобы их нельзя было прочитать скриптами страницы.
Многофакторная аутентификация: аппаратные ключи и стандарты на основе шифрования с открытым ключом — наиболее устойчивый вариант; одноразовые коды приложения — приемлемый компромисс; короткие сообщения — наименее защищённый вариант. Важно защититься от усталостных атак на подтверждения, ограничить попытки, обеспечить восстановление доступа без ослабления всей схемы и мониторить подозрительные входы.
Ключевые концепции
- Соль и параметры стоимости
- Защита от перебора по заранее вычисленным таблицам и регулирование вычислительной сложности.
- Ограничение частоты попыток
- Rate limiting и блокировки: ключевой механизм против подбора паролей.
- JWT
- Формат подписанных утверждений; требует строгой проверки алгоритма, подписи и полей.
- WebAuthn и FIDO2
- Аутентификация по аппаратному ключу на основе открытых ключей.
- Усталостная атака на подтверждения
- Многократные запросы подтверждения входа в расчёте на усталость пользователя.
- Одноразовый токен сброса
- Ограниченный по времени и одноразовый код для восстановления доступа.
Инструменты
- Библиотеки хеширования паролей: Argon2, bcrypt.
- Аутентификационные платформы и провайдеры удостоверений с поддержкой FIDO2.
- Средства анализа JWT для проверки подписи и полей в своей лаборатории.
- Хранилища секретов и менеджеры паролей для административного доступа.
- Средства проверки соответствия политик: аудит настроек провайдера удостоверений.
Практика в легальных лабораториях
- Реализуйте в лабораторном приложении регистрацию и вход с хранением паролей через Argon2 и ограничением попыток.
- Настройте многофакторную аутентификацию для своей учебной учётной записи.
- Разберите образец JWT и проверьте: подпись, алгоритм, сроки, состав утверждений.
- Смоделируйте сброс пароля и убедитесь, что старые сессии инвалидируются.
- Составьте перечень проверок политики аутентификации для своего сервиса.
Защита, детект и защитные меры
- Включайте многофакторную аутентификацию на всех внешних сервисах, особенно административных.
- Ограничивайте частоту попыток и настраивайте оповещения о подозрительных входах.
- Используйте короткие сроки жизни токенов и механизм обновления с возможностью отзыва.
- Проверяйте учётные данные по базам утечек и требуйте смены при совпадении.
Правовая рамка и этика
- Проверки на устойчивость к подбору паролей выполняются только против своих систем и с согласованными ограничениями.
- Работа с чужими учётными данными, даже найденными в утечке, недопустима.
Типичные ошибки
- Хранить пароли в открытом виде или по быстрым хешам.
- Доверять алгоритму, указанному в самом токене.
- Внедрять многофакторную аутентификацию, но оставлять неограниченные попытки подтверждения.
Чек-лист «умею»
- Реализую корректное хранение и проверку паролей.
- Знаю, чем опасен неверно проверяемый JWT.
- Различаю варианты многофакторной аутентификации по стойкости.
- Настраиваю ограничения попыток и оповещения.
- Инвалидирую сессии при смене или сбросе пароля.
Вопросы на интервью
- Как вы защитите форму входа от подбора паролей?
- Почему JWT опасен при неверной проверке?
- Какая многофакторная аутентификация устойчивее и почему?