⏱️ Kryptografi & RFC-protokoll ✓ Verifierad för 2026

TOTP vs. HOTP förklarat: Viktiga skillnader, säkerhet och funktionsprinciper

Miljontals utvecklare och säkerhetsingenjörer ser rullande 6-siffriga verifieringskoder varje dag, men få förstår det eleganta matematiska maskineriet bakom skärmen. Från de händelsestyrda räknarna i RFC 4226 (HOTP) år 2005 till de diskreta tidsstegen i RFC 6238 (TOTP) år 2011, undersöker denna guide den dynamiska trankeringsalgoritmen (Dynamic Truncation) på bytenivå, sårbarheter vid räknardesynkronisering, tolerans för klockdrift och varför TOTP erövrade den moderna webben.

2FA
2FA-Tool Säkerhetsteam
Uppdaterad oktober 2026
Beräknad lästid: 14 min (2 600+ ord)
RFC 6238 RFC 4226 Dynamisk trunkering
💡 Kryptografiska slutsatser (TL;DR)
  • Den grundläggande skillnaden i indata: HOTP beräknar hashar från en monotont ökande räknare C, medan TOTP ersätter C med ett tidssteg T härlett från epoktid (AktuellUnixTid / 30).
  • Direkt arv: TOTP är matematiskt en specialisering av HOTP: TOTP(K, Tid) = HOTP(K, T). Båda algoritmerna använder exakt samma dynamiska trankeringsfunktion (Dynamic Truncation).
  • Arkitektonisk avgörande faktor: HOTP är tillståndsbevarande (servrar måste låsa och skriva räknare till databas vid varje validering). TOTP är tillståndslöst (stateless), vilket gör att moderna molnmikrotjänster kan validera token över distribuerade, lastbalanserade kluster utan centraliserade databasskrivningar.
01

Historiska rötter: Från proprietära hårdvarutoken till öppna webbstandarder

I början av 2000-talet dominerades tvåfaktorsautentisering på företag av proprietära säkerhetsdosor som RSA SecurID. Dessa slutna, dyra enheter innehöll interna kvartskristaller synkroniserade med proprietära företagsservrar. Om en organisation ville erbjuda flerfaktorssäkerhet till tusentals anställda var hårdvaruanskaffningen och de proprietära licenskostnaderna astronomiska.

För att frigöra autentisering från proprietära leverantörer bildades konsortiet OATH (Initiative for Open Authentication) av branschledare för att ta fram öppna, royaltyfria IETF-standarder som alla programvaruutvecklare fritt kunde granska, implementera och analysera:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Anpassad för energisnåla mikrokontrollers med fysiska tryckknappar. Ett tryck på knappen ökar en intern räknare och visar en 6-siffrig token på en LCD-skärm.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Designad i takt med att smarttelefonsanvändningen exploderade. Genom att utnyttja mobilnätets NTP-tidssynkronisering eliminerade TOTP problemet med osynkroniserade knapptryckningar helt.

02

HOTP (RFC 4226) och dynamisk trunkering på bytenivå

Den grundläggande matematiska definitionen av HOTP är anmärkningsvärt koncis:

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

Parameteruppdelning:

  • K: Delad symmetrisk hemlig nyckel (vanligtvis en Base32-avkodad binär sekvens på 160 bitar / 20 byte).
  • C: 8-byte (64-bitars) heltal i big-endian-format som fungerar som räknare.
  • HMAC-SHA-1: Nyckelbaserad hashfunktion för meddelandeautentisering som producerar en 20-byte (160-bitars) kryptografisk digest.

🔍 Hur dynamisk trunkering (DT) konverterar 20 byte till 6 decimala siffror:

En HMAC-SHA1-digest innehåller 160 bitar (20 byte). Att extrahera 6 enhetliga decimala siffror kräver en deterministisk, kollisionsresistent urvalsmekanism som definieras i avsnitt 5.3 i RFC 4226:

// Steg 1: Beräkna dynamisk offset
Offset = HS[19] & 0x0F
Ta den sista byten (index 19) i den 20 byte stora digesten. Maskering med 0x0F isolerar de lägre 4 bitarna, vilket ger ett heltal strikt mellan 0 och 15 (0x0 till 0xF). Detta säkerställer att den efterföljande 4-byte-extraktionen aldrig överskrider bufferten på 20 byte (eftersom 15 + 4 = 19).
// Steg 2: Extrahera 4 på varandra följande byte med maskering
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Extrahera 4 byte med start vid Offset. Masken 0x7F nollställer den mest signifikanta biten för att undvika överflöde med tecken (signed integer overflow) över olika CPU-arkitekturer, vilket garanterar ett rent positivt 31-bitars heltal.
// Steg 3: Modulo-aritmetik för de slutgiltiga siffrorna
OTP = P mod 106 = P mod 1000000
Genom att tillämpa modulo 1 000 000 isoleras de sista 6 decimala siffrorna, med inledande nollor vid behov (t.ex. blir 748 till "000748").
🧪 Konkret testvektor från RFC 4226 bilaga D:

Antag att den hemliga nyckeln är ASCII "12345678901234567890" och räknaren är C = 0. Den resulterande HMAC-SHA1-digesten i hexadecimal form är:

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

1. Den sista byten är 0x71. 0x71 & 0x0F = 0x01, så Offset = 1.
2. Byte 1 till och med 4 är: 93 cf 18 50. Att nollställa MSB ger 0x13cf1850, vilket i decimal form motsvarar 332 339 280.
3. 332339280 mod 1000000 = 339280. Den resulterande 6-siffriga OTP-koden är 339280!

03

Utvecklingen till TOTP (RFC 6238): Tidsstegens mekanik

HOTP krävde att räknaren på klienten och servern hölls i fas. På mjukvaruenheter ledde manuella knapptryckningar eller inmatningsförsök till ständiga synkroniseringsfel.

RFC 6238 ersatte räknaren C med ett diskret tidssteg T som härleds direkt från Unix-epokens klocka:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Antal sekunder som förflutit sedan 1970-01-01 00:00:00 UTC.
  • T0: Referenspunkt för epokinitiering (standardvärde 0 i alla moderna system).
  • X (Tidsstegsfönster): Standardrekommenderad tidslängd på 30 sekunder.
  • Golvfunktionen ⌊ ⌋: För alla tidsstämplar inom samma 30-sekundersfönster förblir T oförändrat. Till exempel utvärderas alla sekunder mellan 1728211200 och 1728211229 till exakt samma 64-bitars heltal T.

Binär serialisering: När T har beräknats packas det till en 8-byte big-endian binär bytebuffert (med identisk minnesstruktur som räknaren C i HOTP). Därmed förenklas den enhetliga formeln till:
TOTP(K, Tid) = HOTP(K, T) Denna matematiska elegans förklarar varför autentiseringsappar rullar över token synkront var 30:e sekund utan att kräva någon tillståndssynkronisering över nätverket.

Stöd för SHA-256 och SHA-512 i RFC 6238: Medan RFC 4226 uteslutande definierade HMAC-SHA-1, utökade RFC 6238 stödet till HMAC-SHA-256 och HMAC-SHA-512. I SHA-256 (32-byte digest) tas offseten från byte 31 (HS[31] & 0x0F); i SHA-512 (64-byte digest) tas offseten från byte 63 (HS[63] & 0x0F). På 99,9 % av alla kommersiella webbplatser (Google, Microsoft, GitHub, AWS) förblir dock SHA-1 standard på grund av kompatibilitet med äldre mobila klienter.
04

Omfattande jämförelsematris sida vid sida (HOTP vs. TOTP)

Dimension HOTP (RFC 4226) TOTP (RFC 6238)
Indatavariabel Händelseräknare C (monotont ökande) Tidssteg T (30-sekunders Unix-epokfönster)
Token-livslängd Obegränsad (giltig tills den förbrukas vid nästa inloggning) Strikt 30 sekunder (ogiltigförklaras automatiskt)
Serverarkitektur Tillståndsbevarande (kräver atomära databasskrivningar vid varje inloggning) Tillståndslös (oberoende NTP-tidskontroll)
Risk för replay-attacker Måttlig (avlyssnad token förblir giltig tills den används) Minimal (begränsad till resterande sekunder i aktuellt fönster)
Primärt felläge Räknardesynkronisering (oavsiktliga knapptryckningar) Klockdrift (tidsavvikelse på klientens telefon)
Hashfunktioner som stöds Endast HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Branschadoption Äldre bankdosor, specialiserade fysiska grindar 99,9 % av alla moderna webbautentiserare
05

Desynkronisering kontra klockdrift: Tekniska lösningar

I distribuerade produktionsmiljöer uppstår oundvikligen avvikelser mellan klient och server. Kryptografer utvecklade explicita kompensationsfönster för att upprätthålla tillförlitligheten:

⚙️ HOTP-lösning: Framåtblickande verifieringsfönster (s)

Om en användare trycker på sin token-knapp 5 gånger utan att skicka in koden når klientens räknare C+5 medan servern stannar på C.
RFC 4226 specificerar att servern vid autentisering beräknar ett framåtblickande fönster över [C+1, C+s] (vanligtvis s=20). Om en träff identifieras hoppar servern framåt och synkroniserar räknare C omedelbart.

⏱️ TOTP-lösning: Tolerans för klockavvikelse (±1 fönster)

På grund av nätverkslatens eller klockavvikelse på klientens enhet (t.ex. en mobilklocka som går 10 sekunder efter) kan token anlända i angränsande tidssteg.
Produktionsservrar utvärderar en array med 3 tidsfönster: [T-1, T, T+1], vilket i praktiken ger ett acceptansfönster på 90 sekunder.

Obligatorisk regel mot replay-attacker: För att förhindra replay-attacker inom det 90 sekunder långa acceptansfönstret måste servrar cacha och låsa förbrukade token i minnet (t.ex. i Redis) under 90 sekunder och avvisa dubbletter.
🛡️ Konstanttidssträngjämförelse (Skydd mot tidsattacker):

När en server kontrollerar om den inskickade koden stämmer överens med den beräknade koden avbryts enkla stränglikhetskontroller (som userOtp === serverOtp) vid det första tecknet som inte matchar. En angripare som mäter mikroskopiska nätverkssvarstider kan därmed återskapa siffrorna iterativt. Företagsinfrastrukturer implementerar konstanttidsjämförelser (t.ex. crypto.timingSafeEqual i Node.js) för att omintetgöra sådana tidsanalyser.

06

Varför TOTP vann det moderna internet

Den avgörande segern för TOTP över HOTP på webben drevs av tre arkitektoniska fördelar:

☁️ Tillståndslös skalbarhet i molnet

I distribuerade mikrotjänster i flera regioner kan vilken serverinstans som helst med en NTP-synkroniserad klocka validera TOTP-koder utan att fråga eller låsa en centraliserad databaspost.

📱 Synergi med det mobila ekosystemet

Smartphones kalibrerar ständigt sina systemklockor via mobilmaster och GPS, vilket eliminerar klockdrift helt utan behov av fysiskt underhåll.

🛡️ Kort 30-sekunders attackfönster

HOTP-koder förblir giltiga på obestämd tid tills de förbrukas. TOTP-koder upphör att gälla inom 30 sekunder, vilket automatiskt neutraliserar komprometterade loggar och nätverksavlyssningar.

🧮 Ren RFC 6238-motor på klientsidan

Upplev TOTP-beräkningar i realtid i 2FA-Tool

Se hur din Base32-hemliga sträng omvandlas till dynamiska 6-siffriga koder via HMAC-SHA1 dynamisk trunkering. 100 % offline i din webbläsare.

Öppna online-generator