Kody jednorazowe mogą być całkowicie poprawne w twoim telefonie, a serwer odrzuci je w tej samej sekundzie. Obie strony obliczają tę samą funkcję ze wspólnego sekretu i bieżącego kroku czasu, więc niezgodność co do czasu daje niezgodność co do kodu. To czyni odchylenie zegara usterką istotną dla bezpieczeństwa, a nie tylko irytacją.

Znaczenie mają tu dwa zegary, a naprawienie widocznego to część, którą ludzie robią najpierw. Ten, który zwykle wymaga uwagi, to drugi.

Kod jest funkcją czasu, a nie hasłem

TOTP bierze wspólny sekret i licznik wyprowadzony z bieżącego czasu, przepuszcza oba przez skrót z kluczem i obcina wynik do krótkiego łańcucha dziesiętnego, zgodnie z RFC 6238. Licznik przesuwa się przy każdym kroku czasu, zwykle trzydzieści sekund, więc ten sam sekret daje nową wartość, gdy krok się zmienia. Weryfikator ponownie oblicza oczekiwaną wartość dla bieżącego kroku i porównuje, co wymaga tego samego sekretu i tego samego wyobrażenia o teraz. Hasło pozostaje wielokrotnego użytku, dopóki nie zostanie zmienione, natomiast ta wartość wygasa na granicy, której klient nie widzi.

Dlatego jeden kod działa, a następny zawodzi kilka chwil później. To wyjaśnia też, dlaczego kopiowanie kodu z wiadomości na czacie jest tak zawodnym nawykiem.

Dwa zegary muszą się zgadzać, nie jeden

Materiał rejestracyjny to pierwsza wspólna rzecz, a czas to druga. Jeśli sekret jest poprawny, a zegary różnią się bardziej niż tolerowane okno, każda wygenerowana wartość trafia w zły krok i jest odrzucana. Jeśli zegary się zgadzają, a sekret jest błędny, każda wartość również jest odrzucana, i oba błędy wyglądają na ekranie logowania identycznie. Rozdzielenie ich oznacza sprawdzenie wpisu konta i czasu osobno, właśnie w tej kolejności.

Zegar weryfikatora zasługuje na taką samą kontrolę jak zegar urządzenia. Serwer z uszkodzonym źródłem czasu odrzuca poprawne kody wszystkich użytkowników naraz, a raporty będą opisywać nagłą awarię, a nie odchylenie. Ten wzorzec warto rozpoznawać, bo jego naprawa należy do serwera, a nie do stu telefonów.

Ile kosztuje poszerzenie okna

Implementacje mogą akceptować kod z sąsiedniego kroku, aby pochłonąć małe różnice, a ta tolerancja jest decyzją projektową, a nie darmową korektą. Każdy dodatkowy krok mnoży liczbę wartości ważnych w dowolnym momencie, a tego właśnie pragnie atakujący, który zgaduje. Zasada blokady powtórzeń ma znaczenie z tego samego powodu, ponieważ kod przyjęty dwa razy to kod, który wyciekł w użyteczny sposób. Administrator, który poszerza okno, aby uciszyć skargi, wymienia realną właściwość na poprawkę kosmetyczną.

Naprawienie zegara jest naprawą, a poszerzenie okna środkiem uspokajającym. Pierwsze usuwa przyczynę, a drugie ją ukrywa.

Sprawdź oba zegary, zanim spróbujesz ponownie

Odczytaj czas na urządzeniu i na serwerze oraz porównaj odchylenia, a nie wyświetlane czasy lokalne. Poniższe polecenia pokazują stan synchronizacji i surowy moment UTC na hoście lub serwerze z Linuksem. Uruchom je na obu końcach, zanim zmienisz jakiekolwiek ustawienie uwierzytelniania.

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

Odchylenie mierzone w sekundach jest nieszkodliwe, mierzone w minutach wyjaśnia odrzucenie, a system, który nie zgłasza żadnego źródła synchronizacji, jest kandydatem do obu. Porównaj dwa znaczniki czasu UTC bezpośrednio, ponieważ czas lokalny zawiera strefę czasową, której algorytm nigdy nie widzi. Jeśli odchylenia są małe, a kody nadal zawodzą, przestań regulować zegary i zamiast tego sprawdź wpis rejestracyjny. Powtarzane próby przeciw zablokowanemu kontu utrudniają zaobserwowanie pierwotnej usterki.

Zapisz czas odrzucenia, odchylenie i treść błędu, a wspólny sekret pozostaw poza tym. Wsparcie poradzi sobie z pierwszymi trzema i nigdy nie powinno zobaczyć czwartego.

Powiązane artykuły