Многофакторная аутентификация (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; храните резервные коды.
Проверьте себя
1. Какая пара является настоящей двухфакторной аутентификацией?
AПароль и PIN-код
BПароль и код из приложения-аутентификатора
CДва разных пароля
DЛогин и пароль
2. Почему SMS-коды считаются слабее приложения-аутентификатора?
AОни длиннее и неудобны
BSMS можно перехватить, а номер — перевыпустить на злоумышленника
CОни работают без интернета
DИх генерирует сам телефон
3. На чём основан 6-значный код TOTP?
AНа случайном числе без привязки к чему-либо
BНа общем секрете и текущем времени
CНа номере телефона
DНа пароле пользователя
Поддержать проект