Банк России годами продвигает переход от одноразовых кодов по SMS к TOTP-приложениям именно из-за роста атак с подменой SIM-карты (SIM swap): злоумышленник, перевыпустивший SIM-карту жертвы у оператора, перехватывает SMS-коды напрямую, тогда как секрет TOTP-приложения физически привязан к конкретному устройству и никогда не передаётся по мобильной сети.
Общий секрет плюс время
Во время настройки сервер и приложение-аутентификатор обмениваются одним общим секретным ключом (именно он закодирован в QR-коде). Далее обе стороны независимо вычисляют HMAC от этого секрета и текущего unix-времени, округлённого до 30-секундного интервала — и получают одинаковый код, не общаясь друг с другом.
Почему это работает без интернета
Поскольку код вычисляется локально из секрета и системного времени устройства, приложению-аутентификатору не нужно сетевое соединение для генерации кода. Единственное требование — чтобы часы сервера и телефона были синхронизированы в пределах небольшого допустимого отклонения (обычно ±30–60 секунд). Именно поэтому TOTP устойчивее к перехвату SIM-swap, чем SMS: секрет никогда не покидает устройство и не зависит от оператора связи.
Почему код меняется каждые 30 секунд
Короткий временной интервал ограничивает окно, в течение которого перехваченный код остаётся действительным, снижая риск его повторного использования злоумышленником. Сервер обычно принимает текущий и один предыдущий интервал, чтобы компенсировать небольшую задержку сети при вводе кода.
Зачем это нужно
- Понимать механику двухфакторной аутентификации при настройке или диагностике проблем с приложениями-аутентификаторами.
- Тестировать собственную реализацию TOTP при разработке системы аутентификации.
- Генерировать коды для автоматизированного тестирования без ручного ввода с телефона.
От чего TOTP не защищает
TOTP надёжно защищает от кражи пароля отдельно от кода, но не от фишинга в реальном времени: если жертва вводит и пароль, и текущий TOTP-код на поддельном сайте, злоумышленник может мгновенно использовать оба значения на настоящем сайте, пока код ещё действителен. От такой атаки защищают только аппаратные ключи по стандарту FIDO2/WebAuthn, криптографически привязанные к конкретному домену.