TOTP (одноразовый пароль по времени)
TOTP — алгоритм одноразового пароля по времени (RFC 6238): сервис и приложение знают общий секрет и текущее время, поэтому независимо считают один и тот же шестизначный код, который меняется каждые 30 секунд.
Как считается код: секрет, время и HMAC
Телефон и сервер не обмениваются кодом: каждый считает его сам, и результаты совпадают. Для этого нужны две вещи. Первая — общий секрет, который сервис выдаёт один раз при подключении (именно он закодирован в QR-коде настройки). Вторая — одинаковое понимание текущего времени.
Стандарт RFC 6238 (май 2011 года) описывает TOTP как надстройку над HOTP из RFC 4226 (декабрь 2005 года): вместо счётчика подставляется номер временного шага. Расчёт укладывается в пять действий.
- Берётся время Unix — секунды с 1 января 1970 года — и вычитается T0 (по умолчанию ноль).
- Результат делится на длину шага X, по умолчанию 30 секунд, дробная часть отбрасывается: T = целая часть от (время − T0) / X.
- Для T и секрета считается HMAC. По умолчанию это HMAC-SHA-1; RFC допускает SHA-256 и SHA-512.
- Из 20 байт результата (для SHA-1) по правилу динамического усечения берутся 4 байта: смещение задают младшие 4 бита последнего байта, старший бит отбрасывается.
- Получившееся число делится на 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-код на экране. Названия пунктов меняются, поэтому ориентируйтесь на текущий интерфейс портала.