Jednorázové kódy mohou být ve vašem telefonu naprosto správné a server je ve stejné sekundě odmítne. Obě strany počítají stejnou funkci ze sdíleného tajemství a aktuálního časového kroku, takže neshoda v čase vede k neshodě v kódu. To dělá z posunu hodin závadu významnou pro bezpečnost, ne jen obtíž.

Záleží tu na dvojích hodinách a oprava těch viditelných je to, co lidé dělají první. Ty, které obvykle potřebují pozornost, jsou ty druhé.

Kód je funkcí času, nikoli heslem

TOTP vezme sdílené tajemství a čítač odvozený z aktuálního času, prožene obojí hashovací funkcí s klíčem a výsledek zkrátí na krátký desítkový řetězec, jak stanoví RFC 6238. Čítač se posouvá s každým časovým krokem, obvykle třicet sekund, takže stejné tajemství vytvoří novou hodnotu, když se krok změní. Ověřovatel přepočítá očekávanou hodnotu pro aktuální krok a porovná ji, což vyžaduje stejné tajemství a stejnou představu o nyní. Heslo zůstává znovupoužitelné, dokud se nezmění, zatímco tato hodnota vyprší na hranici, kterou klient nevidí.

Proto jeden kód funguje a další o pár okamžiků později selže. Vysvětluje to také, proč je kopírování kódu z chatové zprávy tak nespolehlivý zvyk.

Dvoje hodiny se musí shodnout, ne jedny

Zápisový materiál je první sdílená věc a čas je druhá. Pokud je tajemství správné, zatímco se hodiny liší víc než tolerované okno, každá vygenerovaná hodnota dopadne na špatný krok a je odmítnuta. Pokud se hodiny shodují, zatímco tajemství je špatné, každá hodnota je rovněž odmítnuta, a obě selhání vypadají na přihlašovací obrazovce stejně. Oddělit je znamená zkontrolovat záznam účtu a čas nezávisle, v tomto pořadí.

Hodiny ověřovatele si zaslouží stejnou pozornost jako hodiny zařízení. Server s rozbitým zdrojem času odmítne správné kódy všem uživatelům najednou a zprávy budou popisovat náhlý výpadek, nikoli posun. Ten vzorec stojí za to rozpoznat, protože jeho oprava patří na server, ne na sto telefonů.

Co stojí rozšíření okna

Implementace mohou přijmout kód ze sousedního kroku, aby pohltily malé rozdíly, a tato tolerance je rozhodnutí o návrhu, ne bezplatná úprava. Každý další krok násobí počet hodnot platných v kterémkoli okamžiku, což je přesně to, co útočník hádající kódy preferuje. Pravidlo proti opakování má význam ze stejného důvodu, protože kód přijatý dvakrát je kód, který užitečně unikl. Správce, který rozšíří okno, aby umlčel stížnosti, vymění skutečnou vlastnost za kosmetické zlepšení.

Oprava hodin je opravou, zatímco rozšíření okna je sedativum. První odstraňuje příčinu a druhé ji skrývá.

Zkontrolujte oboje hodiny, než to zkusíte znovu

Přečtěte čas v zařízení a na serveru a porovnejte posuny, ne zobrazené místní časy. Níže uvedené příkazy ukazují stav synchronizace a surový okamžik UTC na hostiteli nebo serveru Linux. Spusťte je na obou stranách, než změníte jakékoli nastavení ověřování.

timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status

Posun měřený v sekundách je neškodný, posun v minutách vysvětluje odmítnutí a systém, který nehlásí žádný zdroj synchronizace, je kandidátem na obojí. Porovnejte dva časové údaje UTC přímo, protože místní čas obsahuje časové pásmo, které algoritmus nikdy nevidí. Pokud jsou posuny malé a kódy stále selhávají, přestaňte seřizovat hodiny a raději prozkoumejte zápis. Opakované pokusy proti uzamčenému účtu ztěžují pozorování původní závady.

Zaznamenejte čas odmítnutí, posun a text chyby a sdílené tajemství do toho nezahrnujte. Podpora si vystačí s prvními třemi a čtvrté by nikdy neměla vidět.

Související články