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

Разлика између TOTP и HOTP: Кључне разлике, безбедност и принципи рада

Милиони програмера и безбедносних инжењера свакодневно користе динамичке шестоцифрене верификационе кодове, али мало ко разуме елегантну математичку машинерију која ради испод површине екрана. Од бројача вођених догађајима у стандарду RFC 4226 (HOTP) из 2005. године до дискретних временских корака у стандарду RFC 6238 (TOTP) из 2011. године, овај водич детаљно анализира алгоритам динамичког одсецања на нивоу бајтова, проблем десинхронизације бројача, толеранцију на временско одступање сатова и разлоге због којих је 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. Прилагођен за микроконтролере ниске потрошње са физичким дугметом. Притисак на тастер увећава интерни бројач и генерише шестоцифрени токен на LCD дисплеју.

📜 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 бита).

🔍 Како динамичко одсецање (Dynamic Truncation) претвара 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 декадних цифара, допуњујући почетним нулама уколико број има мање од 6 цифара (нпр. 748 постаје "000748").
🧪 Конкретан тест вектор из Додатка D RFC 4226:

Претпоставимо да је тајни кључ 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. Резултујући шестоцифрени 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 (Прозор временског корака): Стандардно препоручено трајање од 30 секунди.
  • Функција заокруживања наниже ⌊ ⌋: За било који временски тренутак унутар прозора од 30 секунди, вредност T остаје непромењена. На пример, између секунди 1728211200 и 1728211229, вредност T даје потпуно исти 64-битни број.

Бинарна серијализација: Када се вредност T израчуна, она се пакује у 8-бајтни бинарни бафер у big-endian редоследу (потпуно идентичне структуре у меморији као бројач C у HOTP-у). Сходно томе, јединствена формула се своди на:
TOTP(K, Time) = HOTP(K, T) Ова математичка елеганција објашњава зашто апликације за аутентификацију мењају токене синхронизовано на сваких 30 секунди без потребе за разменом података о стању преко мреже.

RFC 6238 подршка за SHA-256 и SHA-512: Док је 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 vs. TOTP)

Димензија HOTP (RFC 4226) TOTP (RFC 6238)
Улазна променљива Бројач догађаја C (монотоно растући) Временски корак T (30-секундни Unix epoch прозор)
Трајање важења токена Неограничено (важи до следеће успешне пријаве) Стриктно 30 секунди (аутоматски истиче)
Архитектура сервера Са чувањем стања (захтева атомски упис у базу при свакој пријави) Без чувања стања (независна NTP верификација)
Изложеност нападима понављања (Replay) Умерена (пресретнути код важи док га корисник не потроши) Минимална (ограничена на преостале секунде текућег прозора)
Основни узрок отказа Десинхронизација бројача (случајни притисци на дугме) Временско одступање (раскорак у сату телефона корисника)
Подржани криптографски хешеви Искључиво HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Заступљеност у индустрији Стари банкарски привесци, специјализоване капије 99,9% модерних веб аутентификатора
05

Десинхронизација vs. Временско одступање: Техничка решења

У реалним дистрибуираним продукционим системима клијенти и сервери неизбежно долазе до благог раскорака. Криптографи су осмислили експлицитне компензационе прозоре како би одржали поузданост рада:

⚙️ HOTP решење: Прозор за претрагу унапред (Look-Ahead Window s)

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

⏱️ TOTP решење: Толеранција на временско одступање (прозор ±1)

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

Обавезно правило заштите од поновног коришћења (Anti-Replay): Како би се спречили replay напади унутар прозора толеранције од 90 секунди, сервери морају да сачувају и закључају искоришћене кодове у меморији (нпр. у Redis-у) током 90 секунди, одбијајући сваки поновни покушај са истим кодом.
🛡️ Поређење стрингова у константном времену (Одбрана од временских напада):

Када сервер проверава да ли унети код одговара израчунатом коду, наивно поређење стрингова (попут userOtp === serverOtp) прекида се на првом карактеру који се не поклапа. Нападач који прецизно мери милисекунде одговора мреже може цифру по цифру да реконструише вредност кода. Продукциони бекенд сервери обавезно примењују поређење у константном времену (нпр. crypto.timingSafeEqual у Node.js окружењу) како би потпуно онемогућили нападе мерењем времена.

06

Зашто је TOTP освојио модерни интернет

Убедљива победа TOTP-а над HOTP-ом на вебу вођена је са три кључне архитектонске предности:

☁️ Скалабилност у облаку без чувања стања

У дистрибуираним мултирегионалним микросервисима било која инстанца сервера са NTP-синхронизованим сатом може да верификује TOTP токен без упита или закључавања централне базе података.

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

Паметни телефони непрекидно аутоматски калибришу своје системске сатове путем мобилних базних станица и GPS-а, елиминишући проблем временског одступања без потребе за одржавањем хардвера.

🛡️ Узак временски прозор напада од 30 секунди

HOTP токени остају важећи неограничено све док се не искористе. TOTP токени аутоматски истичу у року од 30 секунди, неутралишући компромитоване дневнике и пресретнуте мрежне пакете.

🧮 Чисти RFC 6238 алгоритам на страни клијента

Доживите прорачун TOTP кодова у реалном времену у алату 2FA-Tool

Погледајте како се ваш Base32 тајни низ трансформише у динамичке шестоцифрене кодове путем HMAC-SHA1 динамичког одсецања. 100% локално и безбедно у прегледачу.

Отворите онлајн генератор