⏱️ Криптография и RFC протоколи ✓ Анализ на IETF стандарти

Пълно сравнение между TOTP и HOTP: Основни разлики, принципи на работа и сигурност

Милиони разработчици и инженери по сигурност използват 6-значни динамични кодове за верификация всеки ден, но малцина разбират елегантния математически механизъм, работещ зад екрана. От задвижваните от събития броячи по RFC 4226 (HOTP) през 2005 г. до дискретните времеви стъпки по RFC 6238 (TOTP) през 2011 г., това ръководство разглежда алгоритъма за динамично съкращаване (Dynamic Truncation) на байтово ниво, десинхронизацията на брояча, допустимите отклонения във времето и причините, поради които TOTP завладя съвременния уеб.

2FA
Екип по сигурност на 2FA-Tool
Обновено: Октомври 2026
Време за четене: 14 мин (над 2 600 думи)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Криптографски изводи (TL;DR)
  • Фундаменталната разлика във входната променлива: HOTP изчислява хешове от монотонно нарастващ брояч C, докато TOTP заменя C с времева стъпка от епохата T (CurrentUnixTime / 30).
  • Директно наследяване: Математически TOTP е специализация на HOTP: TOTP(K, Time) = HOTP(K, T). И двата алгоритъма използват абсолютно същата функция за динамично съкращаване (Dynamic Truncation).
  • Решаващият архитектурен фактор: HOTP изисква състояние (сървърите трябва да заключват и записват броячите на диск при всяка валидация). TOTP е без състояние (stateless), което позволява на съвременните облачни микроуслуги да валидират токени в разпределени клъстери без централизирани операции по запис в база данни.
01

Исторически корени: От патентовани хардуерни токени към отворени уеб стандарти

В началото на 2000-те години корпоративната двуфакторна автентикация беше доминирана от патентовани хардуерни ключодържатели като RSA SecurID. Тези затворени и скъпи устройства съдържаха вътрешни кварцови кристали, синхронизирани с патентовани корпоративни сървъри. Ако дадена организация искаше да предостави мултифакторна сигурност на хиляди служители, разходите за хардуер и лицензи бяха огромни.

За да освободят автентикацията от зависимостта от отделни доставчици, водещи технологични лидери създадоха консорциума OATH (Initiative for Open Authentication), целящ разработването на отворени, безплатни IETF стандарти, които всеки софтуерен инженер може свободно да изследва, внедрява и одитира:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Разработен специално за микроконтролери с ниска консумация и физически бутон. Натискането на бутона увеличава вътрешния брояч и извежда 6-значен код на течнокристален дисплей.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Проектиран по време на масовото навлизане на смартфоните. Чрез използването на мрежовата синхронизация на времето NTP през мобилните мрежи, TOTP напълно елиминира проблемите с физическото състояние на бутоните.

02

Архитектура на HOTP (RFC 4226) и байтова механика на динамичното съкращаване

Основната математическа дефиниция на HOTP е изключително компактна:

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

Анализ на параметрите:

  • K: Споделен симетричен таен ключ (обикновено Base32 декодирана 160-битова / 20-байтова двоична последователност).
  • C: 8-байтов (64-битов) целочислен брояч в формат Big-Endian.
  • HMAC-SHA-1: Криптографски хеш-код за автентикация на съобщения с ключ, генериращ 20-байтов (160-битов) дайджест.

🔍 Как динамичното съкращаване (DT) превръща 20 байта в 6 цифри:

Дайджестът на HMAC-SHA1 съдържа 160 бита (20 байта). Извличането на 6 равномерно разпределени десетични цифри изисква детерминиран и устойчив на колизии механизъм за избор, дефиниран в Раздел 5.3 на RFC 4226:

// Стъпка 1: Изчисляване на динамичното отместване (Offset)
Offset = HS[19] & 0x0F
Взема се последният байт (индекс 19) от 20-байтовия дайджест. Маскирането с 0x0F изолира младшите 4 бита, което дава цяло число между 0 и 15 (0x0 до 0xF). Това гарантира, че последващото извличане на 4 байта никога няма да излезе извън 20-байтовия буфер (тъй като 15 + 4 = 19).
// Стъпка 2: Извличане на 4 последователни байта с маскиране
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Извличат се 4 байта, започвайки от индекс Offset. Маската 0x7F нулира най-старшия бит (MSB), за да се предотврати препълване на целочислени типове със знак при различни процесорни архитектури (осигурявайки чисто положително 31-битово цяло число).
// Стъпка 3: Модулна аритметика за крайните цифри
OTP = P mod 106 = P mod 1000000
Прилагането на деление по модул 1 000 000 изолира крайните 6 десетични цифри, като при необходимост се допълва с водещи нули (например 748 става „000748“).
🧪 Конкретен тестов пример от RFC 4226 (Апендикс D):

Нека тайният ключ е ASCII низът "12345678901234567890", а броячът C = 0. Резултатният HMAC-SHA1 дайджест в шестнадесетичен вид е:

cc 93 cf 18 50 8d 94 93 4c 64 b6 6d 8b fb 87 fb 23 cb 4b 71

1. Последният байт е 0x71. 0x71 & 0x0F = 0x01, следователно Offset = 1.
2. Байти от 1 до 4 са: 93 cf 18 50. Нулирането на старшия бит дава 0x13cf1850, което в десетична бройна система е точно 332,339,280.
3. 332339280 mod 1000000 = 339280. Резултатният 6-значен OTP е 339280!

03

Еволюцията на TOTP (RFC 6238): Времевата стъпка

HOTP изискваше броячът на клиента непрекъснато да бъде в синхрон със сървъра. При софтуерни устройства броенето на кликвания или натискания на бутони неизбежно води до човешки грешки.

RFC 6238 замени брояча C с дискретна времева стъпка T, извлечена директно от часовника на Unix епохата:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Изминалите секунди от 1970-01-01 00:00:00 UTC.
  • T0: Отправна точка за инициализация на епохата (по подразбиране 0 във всички съвременни системи).
  • X (Времеви интервал / Time Step): Стандартната препоръчителна продължителност от 30 секунди.
  • Функция за закръгляне надолу ⌊ ⌋: За всеки таймстамп в рамките на 30-секундния прозорец, стойността на T остава непроменена. Например между секунди 1728211200 и 1728211229 от епохата, T има абсолютно едно и също 64-битово целочислено значение.

Двоична сериализация: След като T се изчисли, то се пакетира в 8-байтов двоичен буфер в Big-Endian формат (идентичен по структура в паметта с брояча C в HOTP). Следователно обединената формула се свежда до:
TOTP(K, Time) = HOTP(K, T) Тази математическа елегантност обяснява защо приложенията за автентикация сменят кодовете синхронно на всеки 30 секунди, без да се налага поддържане на постоянно състояние.

Поддръжка на SHA-256 и SHA-512 в RFC 6238: Докато RFC 4226 стриктно дефинираше само HMAC-SHA-1, RFC 6238 разшири обхвата с поддръжка на HMAC-SHA-256 и HMAC-SHA-512. При SHA-256 (32-байтов дайджест) отместването се взема от байт 31 (HS[31] & 0x0F); при SHA-512 (64-байтов дайджест) отместването се взема от байт 63 (HS[63] & 0x0F). В 99.9% от масовите уеб платформи (Google, Microsoft, GitHub, AWS) обаче SHA-1 остава стандарт поради универсалната съвместимост с мобилни клиенти.
04

Подробна сравнителна матрица (HOTP срещу TOTP)

Параметър HOTP (RFC 4226) TOTP (RFC 6238)
Входна променлива Брояч на събития C (монотонно нарастващ) Времева стъпка T (30-секунден Unix прозорец)
Валидност на токена Неограничена (до употреба при следващо вписване) Строго 30 секунди (автоматично обезсилване)
Сървърна архитектура Със състояние (изисква атомарни записи в БД при всяко вписване) Без състояние / Stateless (независима проверка по NTP)
Уязвимост на Replay атаки Умерена (прихванат токен остава валиден до използването му) Минимална (ограничена до оставащите секунди в текущия прозорец)
Основен сценарий на отказ Десинхронизация на брояча (случайни натискания на бутона) Времеви дрейф (отклонение в часовника на клиента)
Поддържани криптографски хешове Единствено HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Индустриално приложение Остарели банкови токени, специализиран физически контрол на достъп 99.9% от съвременните уеб автентикатори
05

Десинхронизация срещу времеви дрейф: Инженерни решения

В реални разпределени среди клиентите и сървърите неизбежно се разминават във времето или стъпките. Криптографите са разработили конкретни защитни механизми за компенсиране:

⚙️ Компенсация при HOTP: Прозорец за проверка напред (s)

Ако потребителят натисне бутона на токена си 5 пъти без да се впише, броячът на клиента достига C+5, докато сървърът остава на C.
RFC 4226 предвижда при вход сървърът да изчислява прозорец за проверка напред в диапазона [C+1, C+s] (обикновено s=20). При съвпадение сървърът прескача напред и моментално синхронизира брояча C.

⏱️ Компенсация при TOTP: Толеранс към времеви дрейф (±1 прозорец)

Поради мрежово закъснение или леко отклонение в системния часовник на телефона (например изоставане с 10 секунди), кодовете могат да пристигнат в съседна времева стъпка.
Продукционните сървъри проверяват масив от 3 прозореца: [T-1, T, T+1], което на практика разширява допустимия интервал до 90 секунди.

Задължително правило срещу Replay атаки: За да се предотвратят атаки с повторно използване на кодове в рамките на този 90-секунден интервал, сървърът трябва да кешира и блокира вече използваните токени в паметта (например в Redis) за 90 секунди, отхвърляйки дублирани заявки.
🛡️ Сравнение на низове с постоянно време (Защита от Timing атаки):

Когато сървърът проверява дали въведеният от потребителя код съвпада с изчисления код, наивната проверка за равенство (като userOtp === serverOtp) прекъсва при първия несъответстващ символ. Нападател, измерващ микросекундни разлики във времето за отговор по мрежата, може итеративно да възстанови цифрите една по една. Корпоративните системи задължително налагат сравнения с константно време (например crypto.timingSafeEqual в Node.js), за да неутрализират атаките по страничен канал.

06

Защо TOTP победи в съвременния интернет

Окончателният триумф на TOTP над HOTP в уеб пространството бе продиктуван от три основни архитектурни предимства:

☁️ Облачна мащабируемост без състояние (Stateless)

В разпределени облачни микроуслуги в множество региони всеки сървърен инстанс с NTP-синхронизиран часовник може самостоятелно да валидира TOTP токени, без да прави заявки или да заключва записи в централизирана база данни.

📱 Синхрон с мобилната екосистема

Смартфоните постоянно сверяват часовника си през клетките на мобилните оператори и GPS, което напълно елиминира проблема с времевия дрейф без необходимост от физическа поддръжка на отделни устройства.

🛡️ Тесен 30-секунден прозорец за атака

HOTP токените остават валидни безсрочно до тяхното използване. TOTP токените изтичат автоматично след 30 секунди, обезсилвайки компрометирани логове и прихванати пакети от трафик.

🧮 Изцяло клиентски RFC 6238 енджин

Изпробвайте изчисляването на TOTP в реално време в 2FA-Tool

Вижте как вашият таен Base32 низ се преобразува в динамични 6-значни кодове чрез динамично съкращаване на HMAC-SHA1. 100% офлайн във вашия браузър.

Отворете онлайн генератора