Многофакторная аутентификация (MFA/2FA)
Даже украденный пароль бесполезен, если для входа нужен второй фактор, которого у злоумышленника нет.
Многофакторная аутентификация (MFA) — требование подтвердить личность двумя и более независимыми способами из разных категорий. 2FA — частный случай с двумя факторами.
Три категории факторов
Факторы делят на три группы, и сила MFA именно в том, что используются разные категории:
| Категория | Что это | Примеры |
| Знание | то, что вы знаете | пароль, PIN-код |
| Владение | то, что у вас есть | телефон, аппаратный ключ, приложение-аутентификатор |
| Биометрия | то, чем вы являетесь | отпечаток пальца, лицо |
Два пароля — это не 2FA, потому что оба из категории «знание». А пароль плюс код из приложения — настоящая 2FA: знание плюс владение.
Почему это сильно повышает безопасность
Большинство взломов аккаунтов начинается с украденного или подобранного пароля. Если включён второй фактор, одного пароля недостаточно: злоумышленнику нужен ещё и ваш телефон. Это отсекает подавляющее большинство массовых атак.
Как работают коды-аутентификаторы (TOTP)
Приложения вроде Google Authenticator показывают 6-значный код, который меняется каждые 30 секунд. Это TOTP (Time-based One-Time Password). При настройке сервер и приложение договариваются об общем секрете. Дальше код вычисляется из секрета и текущего времени — без интернета, по обе стороны одинаково.
Принцип «код из секрета и времени» можно проиллюстрировать через HMAC. Запустите учебный пример:
import hmac, hashlib
shared_secret = b"shared-secret-key"
time_step = 56789 # условный «номер 30-секундного интервала»
# код = функция от секрета и времени, одинаковая по обе стороны
digest = hmac.new(shared_secret, str(time_step).encode(), hashlib.sha256).hexdigest()
code = int(digest[:6], 16) % 1_000_000
print(f"Одноразовый код: {code:06d}")
# В следующем интервале времени код станет другим
digest2 = hmac.new(shared_secret, str(time_step + 1).encode(), hashlib.sha256).hexdigest()
code2 = int(digest2[:6], 16) % 1_000_000
print(f"Код в след. интервале: {code2:06d}")
Вывод:
Одноразовый код: 288773 Код в след. интервале: 666188
Главное: код привязан к интервалу времени, поэтому быстро устаревает, а зная только код, нельзя восстановить секрет.
SMS, приложение или аппаратный ключ — что надёжнее
- SMS-коды. Лучше, чем ничего, но слабее остальных: SMS перехватывают, а номер телефона иногда перевыпускают на злоумышленника (атака на SIM-карту).
- Приложение-аутентификатор (TOTP). Надёжнее SMS: код не передаётся по сети, генерируется на устройстве.
- Аппаратные ключи (например, стандарт FIDO2/WebAuthn). Самый сильный вариант: устойчивы даже к фишингу, потому что проверяют адрес сайта.
Резервные коды
При включении MFA сервис обычно даёт набор одноразовых резервных кодов. Их хранят в надёжном месте (менеджер паролей, бумага в сейфе) на случай потери телефона. Без них можно потерять доступ к собственному аккаунту — это вопрос доступности из триады CIA.
Итог
- MFA требует факторы из разных категорий: знание, владение, биометрия.
- Два пароля — не 2FA; пароль + код из приложения — да.
- TOTP-код вычисляется из общего секрета и времени, поэтому быстро устаревает.
- Приложение и аппаратный ключ надёжнее SMS; храните резервные коды.