Перейти к содержимому

TOTP (одноразовый пароль по времени)

TOTP — алгоритм одноразового пароля по времени (RFC 6238): сервис и приложение знают общий секрет и текущее время, поэтому независимо считают один и тот же шестизначный код, который меняется каждые 30 секунд.

Как считается код: секрет, время и HMAC

Телефон и сервер не обмениваются кодом: каждый считает его сам, и результаты совпадают. Для этого нужны две вещи. Первая — общий секрет, который сервис выдаёт один раз при подключении (именно он закодирован в QR-коде настройки). Вторая — одинаковое понимание текущего времени.

Стандарт RFC 6238 (май 2011 года) описывает TOTP как надстройку над HOTP из RFC 4226 (декабрь 2005 года): вместо счётчика подставляется номер временного шага. Расчёт укладывается в пять действий.

  1. Берётся время Unix — секунды с 1 января 1970 года — и вычитается T0 (по умолчанию ноль).
  2. Результат делится на длину шага X, по умолчанию 30 секунд, дробная часть отбрасывается: T = целая часть от (время − T0) / X.
  3. Для T и секрета считается HMAC. По умолчанию это HMAC-SHA-1; RFC допускает SHA-256 и SHA-512.
  4. Из 20 байт результата (для SHA-1) по правилу динамического усечения берутся 4 байта: смещение задают младшие 4 бита последнего байта, старший бит отбрасывается.
  5. Получившееся число делится на 10 в степени «число цифр», остаток и есть код. RFC 4226 требует минимум 6 цифр; шесть вы и видите на экране Google Authenticator.

Условный пример. Допустим, на часах 1 700 000 010 секунд от начала эпохи Unix. Делим на 30, получаем T = 56 666 667. Это число не меняется до секунды 1 700 000 039 включительно, а на 1 700 000 040 становится 56 666 668 — и код меняется.

Секрет в QR-коде записан в кодировке Base32 — родственнице Base64: двоичные данные превращаются в буквы и цифры, которые можно набрать руками. Порядок подключения разбирает статья о двухфакторной аутентификации.

Часы телефона и сервера никогда не идут идеально синхронно, поэтому сервер проверяет не один код, а небольшое окно. RFC 6238 советует допускать не более одного шага назад на сетевую задержку, а накопленный дрейф устройства запоминать и учитывать. Принятый код второй раз не проходит. Если часы телефона убежали дальше, чем на пару шагов, правильный на вид код будет отвергнут — лечится автоматической установкой времени.

Чем TOTP отличается от HOTP, SMS-кода и push

СпособЧто меняет кодОткуда берётся кодНужна ли связь телефона
HOTPСчётчик: +1 после каждого использованияСчитается на устройствеНет
TOTPВремя: новый код каждые 30 секундСчитается на устройствеНет
SMS-кодСервер создаёт новый на каждый входПриходит через оператораДа
PushКода нет: вы нажимаете «Подтвердить»Запрос приходит в приложениеДа

HOTP живёт, пока не использован, и может «уехать» по счётчику, если кнопку на брелке нажимали впустую, — поэтому сервер смотрит на несколько значений вперёд. У TOTP такой проблемы нет, зато есть зависимость от часов. SMS и push требуют сети, а код из приложения считается в режиме полёта. Оба документа — RFC 4226 и RFC 6238 — имеют статус Informational: это описание схемы, а не обязательный интернет-стандарт, но ей следуют Google Authenticator, Яндекс ID (Ключ) и другие приложения.

Слабые места TOTP

  • Секрет лежит у обеих сторон. Пароль сервис обычно хранит в виде хеша и восстановить его нельзя. Секрет TOTP серверу нужен в исходном виде, иначе нечем считать код для сверки. RFC 6238 требует хранить ключи в защищённой области, но утечка такой базы раскрывает коды всех пользователей.
  • Фишинг в реальном времени. Поддельный сайт просит пароль и код и тут же вводит их на настоящем, пока код ещё действует. NIST в редакции SP 800-63B-4 (июль 2025) прямо пишет, что одноразовый код, который вводят вручную, не устойчив к фишингу.
  • Перебор. Шесть цифр — это миллион вариантов. Если сервер принимает три значения (текущее и соседние), случайная попытка угадывает с вероятностью три на миллион, так что защищает только лимит попыток, который рекомендует RFC 4226.
  • Секрет в QR-коде настройки. Фото экрана с ним даёт тому, кто его получил, те же коды, что видите вы. Не публикуйте и не пересылайте такие картинки — подробнее об этом в разделе про безопасность QR-кодов.
  • Потеря телефона. Секрет остаётся на устройстве, и без запасных путей (резервные коды, второй способ входа) придётся проходить восстановление у сервиса.

Частые вопросы

Почему код TOTP не подходит, хотя я ввожу его правильно?

Первая причина — часы: телефон отстаёт или спешит больше чем на один-два шага по 30 секунд. Включите автоматическое определение даты и времени и введите свежий код.

Работает ли TOTP без интернета?

Да. Код считается на телефоне из секрета и часов, связь с сервером для этого не нужна. Интернет нужен лишь устройству, на котором вы вводите код. Поэтому аутентификатор выручает в поездках, когда SMS не доходят.

Чем TOTP надёжнее SMS-кода?

Код не идёт через оператора связи, поэтому его нельзя перехватить в сети и получить через подмену SIM-карты. Фишинг в реальном времени работает против обоих способов одинаково. NIST относит SMS к ограниченным (restricted) каналам и требует предлагать альтернативу.

Можно ли использовать TOTP на Госуслугах?

Да. В настройках безопасности личного кабинета включается «Вход с подтверждением» и выбирается вариант «Одноразовый код (TOTP)»: приложение подключают, отсканировав QR-код на экране. Названия пунктов меняются, поэтому ориентируйтесь на текущий интерфейс портала.