HOTP
HOTP (HMAC-based One-Time Password, RFC 4226), счётчик-базированный аналог TOTP. Там где TOTP продвигается по часам, HOTP продвигается по общему счётчику, который и токен, и сервер увеличивают с каждым использованным кодом.
URI scheme:Google Authenticator Key URI Format, the
otpauth:// scheme every authenticator agrees on. Sibling spec:TOTP (RFC 6238), time-based variant that builds on HOTP.
Что это такое
QR-код регистрации HOTP, это URL в схеме otpauth:// с hotp в качестве типа. Он содержит общий секрет HMAC плюс значение счётчика, которое обе стороны должны держать синхронизированным. Формат:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-кодирован. Пример:YubiKey:alice@example.com. - secret, общий ключ HMAC, закодированный в Base32 (RFC 4648 §6: A-Z, 2-7).
- counter, начальное значение счётчика. Обычно
0, но можно возобновить с известного значения при повторной регистрации токена. - issuer, название сервиса, отображаемое в приложении-аутентификаторе.
- digits,
6(по умолчанию) или8. RFC 4226 §5.3 определяет 6; 8, общее расширение. - algorithm, на практике
SHA1. RFC 4226 определяет только SHA1; варианты SHA256/512, расширения RFC 6238.
HOTP против TOTP, когда использовать что
| Свойство | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Продвигается по | Счётчику (каждое успешное использование) | Часам (каждые 30 с) |
| Требует синхронизации часов | Нет | Да, в пределах ~30 с дрейфа |
| Ресинхронизация при дрейфе | Сервер принимает следующие N значений счётчика | Сервер принимает окно ±1 |
| Типичное применение | YubiKey, устаревшие аппаратные токены, офлайн-банкинг | Любая потребительская 2FA, Google, Microsoft, 1Password, Authy |
| Повторное использование счётчика | Катастрофически, со временем раскрывает секрет | Не применимо |
| Уязвимость при утечке секрета | Все будущие коды предсказуемы | Все прошлые + будущие коды предсказуемы |
Канонические тестовые векторы
RFC 4226 Приложение D содержит контрольные значения HOTP для секрета 12345678901234567890 (20 байт, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) с 6-значным выводом:
| Counter | HOTP (6-digit) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Минимальная полезная нагрузка QR для регистрации при счётчике 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Живой валидатор секрета Base32
Тот же валидатор, что на странице TOTP, секреты HOTP используют идентичный алфавит Base32 (RFC 4648 §6: A-Z, 2-7). Работает в браузере, без обращения к серверу.
Распространённые ошибки
- Дрейф счётчика. Если пользователь нажимает кнопку токена, но сервер не регистрирует код, счётчик токена опережает счётчик сервера. Серверы обрабатывают это с помощью 'окна ресинхронизации'.
- Повторное использование счётчика катастрофично. Никогда не принимайте одно и то же значение счётчика дважды. RFC 4226 §7.3 обязывает сервер отклонять коды на уровне или ниже последнего принятого счётчика.
- Экспорт счётчика при резервном копировании. Приложения-аутентификаторы при экспорте записей HOTP иногда экспортируют секрет, но не текущий счётчик. Импорт на новое устройство перезапускает счётчик с 0.
- Base32, не Base64. То же правило, что и для TOTP: секреты с
0,1,8,9, строчными буквами,+или/являются Base64 и будут отклонены каждым RFC-совместимым аутентификатором. - Только SHA1 на практике. RFC 4226 определяет SHA1 как функцию HMAC. SHA256/SHA512, расширения TOTP эпохи RFC 6238; большинство аппаратных токенов HOTP не реализуют их.
- Параметр цифр часто игнорируется. Многие аппаратные токены жёстко установлены на 6 цифр и молча обрезают при запросе 8. Проверяйте целевое оборудование перед печатью QR-карт.
- Не смешивайте HOTP и TOTP в одном QR. Схема URI использует сегмент
TYPE(hotpvstotp) для переключения режимов. Один секрет может обеспечивать оба, но оба потока разделяют секрет.
Совместимость аутентификаторов
| Приложение / Токен | HOTP | SHA256/512 | 8 цифр | Примечания |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/desktop) | Yes | Yes | Yes | HOTP, канонический режим YubiKey OATH. Полная поддержка RFC 4226. |
| Google Authenticator | Yes | Игнорируется (только SHA1) | Игнорируется (только 6) | De facto базовый уровень. Безопасен для HOTP, но только с 6-значным SHA1. |
| 1Password | Yes | Yes | Yes | Полная поддержка RFC. Счётчик хранится и экспортируется вместе с записью. |
| Bitwarden | Yes | Yes | Yes | Полная поддержка RFC. |
| Microsoft Authenticator | Yes | Yes | Yes | Полная поддержка RFC. |
| Authy | No | , | , | Удалил HOTP в последних версиях. Только TOTP. |
| Duo Mobile | No | , | , | Использует собственный push-поток; только TOTP как запасной вариант. |
| OATH hardware tokens (Feitian, Token2, etc.) | Yes | Varies | Varies | Каноничный рынок аппаратного HOTP; всегда 6-значный SHA1, если в техническом паспорте не указано иное. |
Смотрите также
- /hotp-qr-code/, генератор HOTP с живой валидацией счётчика + Base32.
- /standards/totp/, временной аналог (RFC 6238).
- /totp-2fa-qr-code/, генератор TOTP.
- /standards/, вернуться к индексу стандартов.