# Двухфакторная аутентификация

> Подтверждение входа двумя независимыми факторами — знанием, владением и биометрией; одноразовые коды SMS и TOTP, push, аппаратные ключи и passkeys.

Источник: https://llmdocs.ru/wiki/two-factor-auth/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Факторы**: знание (пароль), владение (телефон, ключ), неотъемлемость (биометрия)
- **Одноразовые коды**: HOTP (RFC 4226), TOTP (RFC 6238)
- **Стойкие к фишингу**: FIDO2/WebAuthn — аппаратные ключи, passkeys
- **Слабые варианты**: SMS, звонок, коды по email
- **Приложения TOTP**: Google Authenticator, Яндекс Ключ, Aegis, 2FAS, менеджеры паролей
**Двухфакторная аутентификация** (2FA), или в общем случае **многофакторная** (MFA), — способ подтверждения личности, при котором пользователь предъявляет два или более доказательства **разных типов**: что-то, что он знает (пароль), что-то, чем он владеет (телефон, аппаратный ключ), или что-то, чем он является (отпечаток пальца, лицо). Утечка пароля сама по себе тогда не даёт доступа к аккаунту. По оценкам крупных провайдеров, включённая MFA блокирует подавляющее большинство автоматизированных атак на учётные записи, поэтому её требуют для администраторов, разработчиков, банков и всё чаще — для всех пользователей.[7] Общая картина проверки личности и прав — в статье [Аутентификация и авторизация](https://llmdocs.ru/wiki/authn-authz.md).

## Факторы

| Фактор | Примеры | Слабости |
|---|---|---|
| Знание | пароль, 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](https://llmdocs.ru/wiki/hash-function.md) от секрета и номера текущего 30-секундного интервала, усечённый до 6 цифр. Предшественник — **HOTP** — использует счётчик вместо времени.[2] Серверу нужно принимать коды из соседних интервалов на случай расхождения часов и запрещать повторное использование кода.

```python
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 заменяют общий секрет парой ключей [асимметричной криптографии](https://llmdocs.ru/wiki/public-key-cryptography.md). При регистрации устройство создаёт ключ, привязанный к домену сайта, и отдаёт серверу только открытую часть; при входе подписывает случайный вызов сервера. Браузер сам сообщает устройству домен, поэтому на фишинговом сайте ключ просто не сработает — это главное преимущество.[6]

- **Аппаратные ключи** (YubiKey, Рутокен MFA и аналоги) — ключ не покидает устройство.
- **Passkeys** — те же ключи FIDO, синхронизируемые через облако Apple, Google, менеджер паролей; могут заменить пароль целиком, объединяя владение (устройство) и биометрию или PIN.[4]

## Восстановление доступа

Слабое место любой MFA — сценарий «потерял телефон». Обычные меры: одноразовые **резервные коды**, несколько зарегистрированных ключей, восстановление через поддержку с проверкой личности. Если восстановление сводится к SMS или email, общая стойкость падает до их уровня. Секреты TOTP и резервные коды на стороне сервера хранятся зашифрованными, как и другие [секреты](https://llmdocs.ru/wiki/secrets-management.md).

## Для разработчиков и администраторов

- Включить MFA на [GitHub](https://llmdocs.ru/wiki/github.md), у облачного провайдера, регистратора доменов и в почте — компрометация этих аккаунтов ведёт ко всему остальному.
- Для [SSH](https://llmdocs.ru/wiki/ssh.md) — ключи вместо паролей, при необходимости ключи на FIDO-токене (`ssh-keygen -t ed25519-sk`).
- В своём сервисе — поддержать TOTP и WebAuthn, ограничить число попыток ввода кода, требовать повторную проверку для опасных действий (смена пароля, вывод средств).
- При входе через внешних провайдеров по [OAuth 2.0 и OpenID Connect](https://llmdocs.ru/wiki/oauth-oidc.md) MFA обеспечивает провайдер.

## См. также

- [Аутентификация и авторизация](https://llmdocs.ru/wiki/authn-authz.md)
- [Хранение паролей (bcrypt, Argon2)](https://llmdocs.ru/wiki/password-storage.md)
- [OAuth 2.0 и OpenID Connect](https://llmdocs.ru/wiki/oauth-oidc.md)
- [Криптография с открытым ключом](https://llmdocs.ru/wiki/public-key-cryptography.md)
- [OWASP Top 10](https://llmdocs.ru/wiki/owasp-top-10.md)

## Источники

1. [RFC 6238 — TOTP: Time-Based One-Time Password Algorithm](https://www.rfc-editor.org/rfc/rfc6238)
2. [RFC 4226 — HOTP: An HMAC-Based One-Time Password Algorithm](https://www.rfc-editor.org/rfc/rfc4226)
3. [W3C — Web Authentication (WebAuthn) Level 3](https://www.w3.org/TR/webauthn-3/)
4. [FIDO Alliance — Passkeys](https://fidoalliance.org/passkeys/)
5. [NIST SP 800-63B — Digital Identity Guidelines: Authentication](https://pages.nist.gov/800-63-4/sp800-63b.html)
6. [CISA — Implementing Phishing-Resistant MFA](https://www.cisa.gov/sites/default/files/publications/fact-sheet-implementing-phishing-resistant-mfa-508c.pdf)
7. [OWASP — Multifactor Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Multifactor_Authentication_Cheat_Sheet.html)
