TOTP — стандарт одноразовых паролей¶
TOTP (Time-based One-Time Password, одноразовый пароль на основе времени) — алгоритм генерации одноразовых паролей, в котором секретный ключ и текущее время служат входными данными для вычисления короткого цифрового кода. Стандарт описан в документе RFC 6238, опубликованном рабочей группой IETF в 2011 году, и является расширением более раннего алгоритма HOTP (HMAC-based One-Time Password, RFC 4226, 2005). TOTP широко используется в двухфакторной аутентификации (2FA) как второй фактор, дополняющий пароль.
¶Принцип работы
Алгоритм использует счётчик времени — количество прошедших интервалов фиксированной длины от эпохи (по умолчанию эпоха UNIX, 1 января 1970 года). По умолчанию длина интервала составляет 30 секунд. Формула вычисления кода:
TOTP = HOTP(K, T), где T = floor((CurrentUnixTime - T0) / X)
K— общий секретный ключ, известный серверу и клиенту;T0— начальная эпоха (по умолчанию 0);X— длина шага времени (по умолчанию 30 секунд).
Внутри вызывается функция HOTP, основанная на HMAC-SHA1 (допускаются также HMAC-SHA256 и HMAC-SHA512). Результат HMAC преобразуется в шестизначный десятичный код методом динамического усечения. Для проверки сервер вычисляет код для текущего и нескольких соседних интервалов времени (обычно ±1), чтобы учесть рассинхронизацию часов между клиентом и сервером.
¶История
В 2004 году ОАСИ (Open Authentication Standards Collaborative) выпустила спецификацию HOTP. В 2005 году алгоритм был стандартизирован IETF в RFC 4226. В 2011 году IETF опубликовал RFC 6238, описывающий TOTP как профиль HOTP с временной меткой вместо счётчика. Авторы стандарта — Дэвид Отэм (David Otham) и Сатьи Дас (Sathya Das) из компании VeriSign. Стандарт быстро получил широкое распространение: его поддержали Google (Google Authenticator), Microsoft, Apple (встроенный механизм кодов в iOS и macOS), а также множество сторонних приложений и аппаратных токенов.
¶Применение
TOTP реализуется в виде приложений-аутентификаторов, которые пользователь устанавливает на смартфон или компьютер. Наиболее известные реализации:
- Google Authenticator — мобильное приложение для Android и iOS;
- Microsoft Authenticator — поддерживает TOTP и push-уведомления;
- Authy — кроссплатформенное приложение с облачным резервным копированием;
- FreeOTP — свободное открытые исходное приложение от Red Hat;
- Aegis Authenticator — свободное приложение для Android с шифрованием хранилища;
- 1Password, Bitwarden — менеджеры паролей со встроенной генерацией TOTP.
Помимо программных решений существуют аппаратные токены (например, YubiKey в режиме TOTP) и встроенные функции аппаратных ключей FIDO2.
¶Настройка
При активации TOTP пользователь сканирует QR-код, содержащий URI вида otpauth://totp/Пример:пользователь?secret=JBSWY3DPEHPK3PXP&issuer=Пример&algorithm=SHA1&digits=6&period=30. Сервер генерирует секретный ключ (обычно 160 бит в base32), сохраняет его в базе данных и передаёт клиенту. Далее при каждом входе пользователь вводит пароль и текущий шестизначный код из приложения-аутентификатора.
¶Достоинства и ограничения
К достоинствам TOTP относятся отсутствие необходимости в канале связи между клиентом и сервером при генерации кода, низкие требования к устройству (подойдёт любое устройство с часами), а также открытость стандарта. Код не отправляется по сети, поэтому перехватить его сложнее, чем SMS-код.
К ограничениям относится необходимость синхронизации времени между устройством и сервером, уязвимость к фишингу (код можно ввести на поддельном сайте), а также риск компрометации секретного ключа при физическом доступе к устройству или при краже QR-кода. В отличие от аппаратных ключей FIDO2, TOTP не обеспечивает привязку к конкретному домену, что делает его менее устойчивым к атакам типа «man-in-the-middle».
¶Стандарты и документы
- RFC 4226 — HOTP: HMAC-based One-Time Password Algorithm (2005)
- RFC 6238 — TOTP: Time-Based One-Time Password Algorithm (2011)
- RFC 7642, RFC 7644 — связанные стандарты протокола SCIM для управления учётными записями
