TOTP
TOTP (Time-based One-Time Password) — это одноразовый пароль, генерируемый на основе текущего времени и общего секретного ключа. Относится к классу алгоритмов одноразовых паролей (OTP) и является стандартом, определённым в документе RFC 6238. Основное назначение TOTP — обеспечение двухфакторной аутентификации (2FA) и повышение безопасности учётных записей пользователей в цифровых сервисах.
История
Идея одноразовых паролей возникла в 1980-х годах. Первым широко распространённым стандартом стал HOTP (HMAC-based One-Time Password), описанный в RFC 4226 в 2005 году. HOTP генерировал пароли на основе счётчика, который увеличивался при каждом использовании. Однако этот подход имел недостаток: серверу и клиенту необходимо было синхронизировать состояние счётчика, что могло приводить к рассинхронизации.
В 2008 году инженеры из компании VeriSign (ныне часть Symantec) и других организаций предложили модификацию HOTP, использующую время в качестве движущего фактора. Результатом стал стандарт TOTP, опубликованный как RFC 6238 в мае 2011 года. Авторами спецификации выступили Дэвид Максвелл (создатель HOTP) и другие соавторы. С тех пор TOTP стал одним из наиболее распространённых методов двухфакторной аутентификации, используемым в таких сервисах, как Google, Microsoft, GitHub, банковские приложения и многие другие.
Принцип работы
TOTP основан на криптографической функции HMAC-SHA1 (или HMAC-SHA256, HMAC-SHA512) и текущем времени. Процесс генерации пароля состоит из нескольких шагов:
- Секретный ключ — генерируется сервером при первой настройке аутентификации. Обычно передаётся пользователю в виде QR-кода или строки символов. Ключ хранится как на сервере, так и на устройстве пользователя (например, в приложении-аутентификаторе).
- Временной шаг — фиксированный интервал времени, обычно 30 секунд. Стандарт допускает и другие значения (например, 60 секунд), но 30 секунд является наиболее распространённым.
- Вычисление временного значения — текущее время в формате Unix timestamp (количество секунд с 1 января 1970 года) делится на длительность временного шага. Результат округляется вниз до целого числа. Например, для timestamp = 1700000000 и шага 30 секунд временное значение будет равно 56666666.
- Генерация HMAC — на основе секретного ключа и временного значения вычисляется HMAC-хеш. Алгоритм HMAC может использовать SHA-1, SHA-256 или SHA-512.
- Извлечение кода — из полученного хеша извлекается динамическое двоичное значение (Dynamic Truncation). Затем это значение приводится к десятичному числу, длина которого обычно составляет 6 цифр (допускается 7 или 8 цифр). Если полученное число короче заданной длины, оно дополняется ведущими нулями.
- Отображение — полученный код отображается на устройстве пользователя и вводится в интерфейсе сервиса для подтверждения аутентификации.
Сервер, зная секретный ключ и текущее время, выполняет те же вычисления и сравнивает полученный код с введённым пользователем. Для компенсации возможной рассинхронизации времени или задержки ввода сервер может проверять коды для нескольких предыдущих и следующих временных шагов (обычно ±1 шаг).
Характеристики
Преимущества
- Независимость от сети — TOTP не требует подключения к интернету или мобильной сети для генерации пароля. Это делает его надёжным в условиях отсутствия связи.
- Отсутствие синхронизации счётчика — в отличие от HOTP, TOTP не требует поддержки состояния счётчика, что упрощает реализацию и снижает риск рассинхронизации.
- Простота реализации — алгоритм не требует сложных вычислений и может быть реализован на любом устройстве с часами и поддержкой HMAC.
- Стандартизация — RFC 6238 является открытым стандартом, что обеспечивает совместимость между различными реализациями и приложениями.
Недостатки
- Зависимость от точности времени — для корректной работы TOTP необходимо, чтобы часы на устройстве пользователя и сервере были синхронизированы с точностью до нескольких секунд. Расхождение более чем на один временной шаг приводит к неработоспособности пароля.
- Ограниченное время действия — пароль действителен только в течение одного временного шага (обычно 30 секунд). Если пользователь не успевает ввести код за это время, ему приходится ждать следующего шага.
- Уязвимость к перехвату — если злоумышленник перехватывает TOTP-код во время передачи (например, через фишинговый сайт), он может использовать его в течение оставшегося времени действия. Однако этот риск снижается за счёт короткого срока жизни кода.
- Необходимость резервного копирования — если секретный ключ утерян (например, при сбросе телефона), доступ к учётной записи может быть восстановлен только через альтернативные методы (резервные коды, электронная почта и т.п.).
Применение
Двухфакторная аутентификация (2FA)
Основное применение TOTP — реализация двухфакторной аутентификации. Пользователь вводит не только пароль (первый фактор), но и одноразовый код из аутентификатора (второй фактор). Это значительно повышает безопасность, так как даже при компрометации пароля злоумышленник не сможет войти в систему без доступа к устройству с секретным ключом.
Приложения-аутентификаторы
Для генерации TOTP-кодов используются специализированные приложения, такие как:
- Google Authenticator
- Microsoft Authenticator
- Authy
- LastPass Authenticator
- 1Password
- Яндекс.Ключ
Эти приложения хранят секретные ключи и генерируют коды на основе текущего времени. Некоторые из них поддерживают резервное копирование ключей в облако (например, Authy) или синхронизацию между устройствами.
Интеграция в сервисы
TOTP поддерживается большинством крупных интернет-сервисов, включая:
- Google (Gmail, Google Workspace)
- Microsoft (Outlook, Azure, Office 365)
- GitHub, GitLab
- Facebook (организация Meta признана экстремистской и запрещена в РФ)
- Twitter (X)
- Dropbox
- банковские и финансовые приложения
- VPN-сервисы
- корпоративные системы
Аппаратные токены
Некоторые аппаратные устройства, такие как YubiKey, поддерживают генерацию TOTP-кодов. Они хранят секретные ключи и отображают коды на встроенном дисплее или передают их через USB/NFC. Аппаратные токены считаются более безопасными, так как ключи физически изолированы от операционной системы.
Альтернативы и сравнение
HOTP
HOTP (HMAC-based One-Time Password) — предшественник TOTP, использующий счётчик вместо времени. Пароль HOTP действителен до тех пор, пока не будет использован, что может приводить к проблемам синхронизации при многократной генерации кодов без их использования. TOTP лишён этого недостатка, но требует синхронизации часов.
SMS-коды
Многие сервисы используют отправку одноразовых кодов по SMS. Этот метод менее безопасен, так как SMS-сообщения могут быть перехвачены (например, через атаки SIM-свопинга) или перехвачены злоумышленниками через уязвимости в сетях сотовой связи. TOTP считается более безопасным, так как не зависит от внешних каналов связи.
Push-уведомления
Некоторые сервисы (например, Microsoft Authenticator) предлагают аутентификацию через push-уведомления, где пользователь просто нажимает «Подтвердить» на экране телефона. Этот метод удобнее, но требует подключения к интернету и может быть уязвим к атакам типа «MFA fatigue» (когда злоумышленник многократно отправляет запросы, чтобы утомить пользователя и заставить его подтвердить вход).
WebAuthn / FIDO2
Стандарты WebAuthn и FIDO2 используют криптографические ключи (асимметричное шифрование) для аутентификации. Этот подход считается более безопасным, чем TOTP, так как не требует ввода кода вручную и устойчив к фишингу. Однако WebAuthn требует поддержки со стороны браузера и устройства, что не всегда доступно.
Интересные факты
- Стандарт TOTP допускает использование различных хеш-функций: SHA-1, SHA-256 и SHA-512. Наиболее распространённой является SHA-1, несмотря на его теоретическую уязвимость к коллизиям, так как для атаки на TOTP требуется подобрать не хеш, а сам ключ.
- Длина кода TOTP обычно составляет 6 цифр, что даёт 1 000 000 возможных комбинаций. Вероятность угадать правильный код за одну попытку составляет 0,0001%.
- Временной шаг в 30 секунд выбран как компромисс между безопасностью и удобством: слишком короткий шаг (например, 10 секунд) делает код неудобным для ввода, а слишком длинный (например, 60 секунд) увеличивает окно уязвимости.
- Некоторые реализации TOTP позволяют настраивать «окно допуска» — количество временных шагов, которые сервер проверяет в обе стороны от текущего времени. Это помогает компенсировать рассинхронизацию часов, но снижает безопасность, так как увеличивает количество действительных кодов.
Критика и ограничения
Основная критика TOTP связана с его уязвимостью к фишинговым атакам. Если пользователь вводит TOTP-код на поддельном сайте, злоумышленник может немедленно использовать его для аутентификации на настоящем сервисе. Это отличает TOTP от более современных методов, таких как WebAuthn, которые привязывают код к конкретному домену.
Также отмечается, что TOTP не защищает от атак типа «человек посередине» (MITM), если злоумышленник может перехватить и ретранслировать трафик в реальном времени.
Несмотря на эти недостатки, TOTP остаётся одним из самых популярных и доступных методов двухфакторной аутентификации благодаря своей простоте, открытости и независимости от внешних сервисов.
Источники
- RFC 6238 — TOTP: Time-Based One-Time Password Algorithm (Internet Engineering Task Force, 2011)
- RFC 4226 — HOTP: An HMAC-Based One-Time Password Algorithm (IETF, 2005)
- OWASP — Time-based One-Time Password (TOTP) (Open Web Application Security Project)
- NIST SP 800-63B — Digital Identity Guidelines: Authentication and Lifecycle Management (National Institute of Standards and Technology, 2017)
- Документация Google Authenticator (Google Inc.)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →