Двухфакторная аутентификация
| Факторы | знание (пароль), владение (телефон, ключ), неотъемлемость (биометрия) |
|---|---|
| Одноразовые коды | HOTP (RFC 4226), TOTP (RFC 6238) |
| Стойкие к фишингу | FIDO2/WebAuthn — аппаратные ключи, passkeys |
| Слабые варианты | SMS, звонок, коды по email |
| Приложения TOTP | Google Authenticator, Яндекс Ключ, Aegis, 2FAS, менеджеры паролей |
Двухфакторная аутентификация (2FA), или в общем случае многофакторная (MFA), — способ подтверждения личности, при котором пользователь предъявляет два или более доказательства разных типов: что-то, что он знает (пароль), что-то, чем он владеет (телефон, аппаратный ключ), или что-то, чем он является (отпечаток пальца, лицо). Утечка пароля сама по себе тогда не даёт доступа к аккаунту. По оценкам крупных провайдеров, включённая MFA блокирует подавляющее большинство автоматизированных атак на учётные записи, поэтому её требуют для администраторов, разработчиков, банков и всё чаще — для всех пользователей.[7] Общая картина проверки личности и прав — в статье Аутентификация и авторизация.
Факторы
| Фактор | Примеры | Слабости |
|---|---|---|
| Знание | пароль, PIN, ответ на секретный вопрос | фишинг, утечки, повторное использование |
| Владение | телефон с приложением, SIM-карта, аппаратный ключ, смарт-карта | потеря, кража, перевыпуск SIM |
| Неотъемлемость | отпечаток, Face ID | нельзя сменить; обычно лишь разблокирует локальный ключ |
Пароль и секретный вопрос — это два знания, а не два фактора. Биометрия в современных системах почти всегда проверяется локально на устройстве и разблокирует криптографический ключ, а не отправляется на сервер.
Способы второго фактора
От слабых к сильным:
- SMS и звонок — код приходит на номер телефона. Уязвимы к перевыпуску SIM-карты мошенниками (SIM swap), перехвату через уязвимости сети SS7 и фишингу; NIST относит их к ограниченно допустимым.[5] Тем не менее это намного лучше, чем один пароль.
- Код по email — безопасность равна безопасности почтового ящика.
- TOTP — приложение-аутентификатор генерирует шестизначный код, меняющийся каждые 30 секунд.[1]
- Push-подтверждение — запрос «Это вы входите?» в приложении. Уязвимо к «бомбардировке» запросами (MFA fatigue), пока пользователь не нажмёт «да»; помогает показ числа, которое нужно ввести.
- Аппаратные ключи и passkeys (FIDO2/WebAuthn) — криптографическая проверка, устойчивая к фишингу.[3]
Как работает TOTP
При включении сервер и приложение получают общий секрет — обычно через QR-код с URI otpauth://totp/…?secret=…. Код вычисляется как HMAC от секрета и номера текущего 30-секундного интервала, усечённый до 6 цифр. Предшественник — HOTP — использует счётчик вместо времени.[2] Серверу нужно принимать коды из соседних интервалов на случай расхождения часов и запрещать повторное использование кода.
import pyotp
secret = pyotp.random_base32() # хранить зашифрованным
uri = pyotp.TOTP(secret).provisioning_uri(name="user@example.ru",
issuer_name="llmdocs") # → QR-код
pyotp.TOTP(secret).verify("492039", valid_window=1)
TOTP не защищает от фишинга: поддельный сайт просит ввести код и тут же использует его на настоящем (атаки типа adversary-in-the-middle с инструментами вроде Evilginx).
FIDO2, WebAuthn и passkeys
Стандарты FIDO Alliance и W3C WebAuthn заменяют общий секрет парой ключей асимметричной криптографии. При регистрации устройство создаёт ключ, привязанный к домену сайта, и отдаёт серверу только открытую часть; при входе подписывает случайный вызов сервера. Браузер сам сообщает устройству домен, поэтому на фишинговом сайте ключ просто не сработает — это главное преимущество.[6]
- Аппаратные ключи (YubiKey, Рутокен MFA и аналоги) — ключ не покидает устройство.
- Passkeys — те же ключи FIDO, синхронизируемые через облако Apple, Google, менеджер паролей; могут заменить пароль целиком, объединяя владение (устройство) и биометрию или PIN.[4]
Восстановление доступа
Слабое место любой MFA — сценарий «потерял телефон». Обычные меры: одноразовые резервные коды, несколько зарегистрированных ключей, восстановление через поддержку с проверкой личности. Если восстановление сводится к SMS или email, общая стойкость падает до их уровня. Секреты TOTP и резервные коды на стороне сервера хранятся зашифрованными, как и другие секреты.
Для разработчиков и администраторов
- Включить MFA на GitHub, у облачного провайдера, регистратора доменов и в почте — компрометация этих аккаунтов ведёт ко всему остальному.
- Для SSH — ключи вместо паролей, при необходимости ключи на FIDO-токене (
ssh-keygen -t ed25519-sk). - В своём сервисе — поддержать TOTP и WebAuthn, ограничить число попыток ввода кода, требовать повторную проверку для опасных действий (смена пароля, вывод средств).
- При входе через внешних провайдеров по OAuth 2.0 и OpenID Connect MFA обеспечивает провайдер.
См. также
- Аутентификация и авторизация
- Хранение паролей (bcrypt, Argon2)
- OAuth 2.0 и OpenID Connect
- Криптография с открытым ключом
- OWASP Top 10
Источники
- RFC 6238 — TOTP: Time-Based One-Time Password Algorithm
- RFC 4226 — HOTP: An HMAC-Based One-Time Password Algorithm
- W3C — Web Authentication (WebAuthn) Level 3
- FIDO Alliance — Passkeys
- NIST SP 800-63B — Digital Identity Guidelines: Authentication
- CISA — Implementing Phishing-Resistant MFA
- OWASP — Multifactor Authentication Cheat Sheet