Открыть сервис

HMAC-based One-Time Password

HMAC-based One-Time Password (HMAC-основанный одноразовый пароль, сокращённо HOTP) — это алгоритм генерации одноразовых паролей, основанный на криптографической хеш-функции с использованием ключа (HMAC). HOTP является открытым стандартом, описанным в документе RFC 4226, опубликованном в декабре 2005 года Инженерным советом Интернета (IETF). Алгоритм широко применяется для двухфакторной аутентификации (2FA) в системах безопасности, таких как банковские приложения, корпоративные VPN и онлайн-сервисы.

История

Разработка HOTP была инициирована в начале 2000-х годов как ответ на потребность в стандартизированном и безопасном методе генерации одноразовых паролей. До появления HOTP существовали проприетарные решения, такие как RSA SecurID, которые были закрытыми и дорогими. В 2004 году группа исследователей, включая Дэвида М’Раихи (David M’Raihi) и Мэдисона Кеннеди (Madison Kennedy), представила черновик стандарта, который впоследствии был принят как RFC 4226. Алгоритм был разработан для использования в устройствах-токенах, мобильных приложениях и программных реализациях, обеспечивая совместимость между различными платформами. HOTP стал основой для более позднего стандарта Time-based One-Time Password (TOTP), описанного в RFC 6238, который использует время вместо счётчика.

Принцип работы

HOTP генерирует одноразовый пароль на основе двух входных параметров: секретного ключа (K) и счётчика (C). Счётчик представляет собой целое число, которое увеличивается на единицу после каждой успешной аутентификации. Алгоритм использует HMAC (Hash-based Message Authentication Code) с одной из криптографических хеш-функций, обычно SHA-1, хотя могут применяться SHA-256 и SHA-512.

Формула вычисления HOTP выглядит следующим образом:

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C))

где:

  • K — секретный ключ, известный только серверу и клиенту;
  • C — 8-байтовое значение счётчика (big-endian);
  • HMAC-SHA-1 — вычисление HMAC с хеш-функцией SHA-1, результатом которого является 20-байтовый дайджест;
  • Truncate — функция усечения, которая извлекает из дайджеста 4-байтовое значение и преобразует его в десятичное число заданной длины (обычно 6 или 8 цифр).

Функция усечения (Truncate)

Функция Truncate выполняет следующие шаги:

  1. Извлекает младшие 4 бита последнего байта дайджеста HMAC (это значение называется offset, от 0 до 15).
  2. Берёт 4 байта, начиная с позиции offset (включительно), и формирует 32-битное целое число без знака.
  3. Обнуляет старший бит этого числа (чтобы избежать отрицательных значений в некоторых языках программирования), получая значение DT (Dynamic Truncation).
  4. Вычисляет HOTP-значение по формуле: HOTP = DT mod 10^d, где d — желаемая длина пароля (обычно 6, 7 или 8 цифр). Если результат имеет менее d цифр, он дополняется ведущими нулями.

Пример: если DT = 123456789, а d = 6, то HOTP = 123456789 mod 10^6 = 456789.

Характеристики

Длина пароля

Стандарт RFC 4226 рекомендует длину пароля от 6 до 8 цифр. Наиболее распространённым является 6-значный пароль, так как он обеспечивает баланс между безопасностью и удобством ввода. 8-значные пароли используются в системах с повышенными требованиями к безопасности, но реже из-за неудобства.

Секретный ключ

Ключ K должен быть случайным, уникальным для каждого устройства или пользователя, и храниться в защищённом виде. Рекомендуемая длина ключа — не менее 128 бит (16 байт), хотя на практике часто используются 160-битные (20 байт) или 256-битные (32 байт) ключи. Ключ может быть представлен в виде строки Base32 для удобства ввода пользователем.

Счётчик

Счётчик C инициализируется нулём при первом использовании и увеличивается на 1 после каждой успешной аутентификации. Сервер и клиент должны синхронизировать свои счётчики. Если счётчик расходится (например, из-за генерации паролей без аутентификации), сервер может использовать механизм «окна» (look-ahead window), позволяющий принять пароль, сгенерированный с небольшим отклонением счётчика (обычно до 100 шагов вперёд).

Применение

Двухфакторная аутентификация (2FA)

HOTP широко используется как второй фактор аутентификации в дополнение к паролю. Пользователь вводит одноразовый пароль, сгенерированный приложением-аутентификатором (например, Google Authenticator, Authy, Microsoft Authenticator) или аппаратным токеном (например, YubiKey). После ввода пароль становится недействительным, что предотвращает его повторное использование при перехвате.

Банковские системы

Многие банки используют HOTP для подтверждения транзакций через SMS или мобильные приложения. Клиент получает одноразовый код, который действителен только для одной операции. В России такие системы применяются, например, в Сбербанке (SMS-коды) и Т-Банке (ранее Тинькофф Банк), хотя с 2023 года некоторые банки переходят на TOTP из-за удобства.

Корпоративные сети

HOTP используется для аутентификации сотрудников при подключении к корпоративным VPN, удалённым рабочим столам и внутренним веб-порталам. Решения на базе HOTP интегрируются с протоколами RADIUS и LDAP.

Аппаратные токены

Устройства, такие как YubiKey и RSA SecurID, могут генерировать HOTP-пароли. В отличие от программных реализаций, аппаратные токены физически защищены от кражи ключа.

Безопасность

Сильные стороны

  • Устойчивость к атакам повторного воспроизведения (replay attacks): каждый пароль действителен только один раз.
  • Отсутствие зависимости от времени: HOTP не требует синхронизации часов, что упрощает реализацию на устройствах без точного времени.
  • Криптографическая стойкость: использование HMAC-SHA-1 обеспечивает защиту от подбора ключа при условии его случайности.

Уязвимости

  • Атака «человек посередине» (MITM): если злоумышленник перехватывает одноразовый пароль, он может использовать его до того, как пользователь завершит аутентификацию. Однако это требует быстрого выполнения атаки.
  • Фишинг: пользователь может быть обманом вынужден ввести пароль на поддельном сайте, который затем использует его для аутентификации на реальном сервере.
  • Утечка секретного ключа: если ключ скомпрометирован, все будущие пароли могут быть сгенерированы злоумышленником.
  • Синхронизация счётчика: при потере синхронизации (например, из-за генерации большого числа неиспользованных паролей) требуется ручная корректировка.

Сравнение с TOTP

HOTP и TOTP являются двумя основными стандартами одноразовых паролей. Основные различия:

ХарактеристикаHOTPTOTP
Входной параметрСчётчик (C)Время (T)
СинхронизацияТребуется синхронизация счётчикаТребуется синхронизация часов
Окно допустимостиФиксированное (обычно 100 шагов)Временное (обычно 30 секунд)
УдобствоМенее удобен при частых сбоях синхронизацииУдобен, так как пароль меняется автоматически
БезопасностьВыше при правильной синхронизацииНиже при рассинхронизации часов

TOTP, основанный на HOTP, заменил его во многих приложениях из-за автоматической смены пароля каждые 30 секунд, что снижает риск атаки MITM. Однако HOTP остаётся востребованным в сценариях, где точное время недоступно (например, в офлайн-токенах).

Реализации

Программные

  • Google Authenticator (поддерживает HOTP и TOTP)
  • FreeOTP (открытый исходный код)
  • Authy (проприетарный, с поддержкой облачной синхронизации)
  • Yubico Authenticator (для YubiKey)

Аппаратные

  • YubiKey (серии 5 и FIPS)
  • RSA SecurID (проприетарный, но совместимый с HOTP)
  • Feitian ePass (поддерживает HOTP)

Библиотеки

  • Для Python: pyotp (поддерживает HOTP и TOTP)
  • Для Java: java-otp (часть Spring Security)
  • Для JavaScript: otplib (Node.js)

Критика

Основная критика HOTP связана с проблемой синхронизации счётчика. Если пользователь генерирует несколько паролей без аутентификации (например, из-за случайного нажатия кнопки на токене), счётчик на устройстве и сервере расходится, что требует ручного сброса или использования окна. Это делает HOTP менее удобным для массового использования по сравнению с TOTP. Кроме того, использование SHA-1, хотя и не скомпрометировано для HMAC, вызывает опасения у некоторых специалистов по безопасности, что привело к рекомендациям использовать SHA-256 в новых реализациях.

Источники

  • RFC 4226: HOTP: An HMAC-Based One-Time Password Algorithm (IETF, 2005)
  • M’Raihi, D., et al. "HOTP: An HMAC-Based One-Time Password Algorithm." Internet Engineering Task Force, 2005.
  • RFC 6238: TOTP: Time-Based One-Time Password Algorithm (IETF, 2011)
  • Спецификация Google Authenticator (Google, 2010)
  • Книга: "Security Engineering" by Ross Anderson (Wiley, 2008)
  • Документация библиотеки pyotp (версия 2.8.0, 2023)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →