Definicja OTP
OTP (One-Time Password, hasło jednorazowe) to kod uwierzytelniający ważny tylko raz albo przez krótkie okno czasu. Generuje go aplikacja w telefonie, token sprzętowy albo system wysyłający SMS lub e-mail. OTP służy jako drugi składnik logowania (MFA) obok hasła, a nie zamiast niego.
Kod z SMS-a, który bank każe przepisać przy przelewie, i sześć cyfr z aplikacji uwierzytelniającej to ten sam rodzaj mechanizmu. Hasło statyczne jest takie samo przy każdym logowaniu, więc raz skradzione działa wielokrotnie. Kod jednorazowy po użyciu albo po upływie okna czasu przestaje być przyjmowany, więc jego późniejsze przejęcie nic nie daje.
Generatorem bywa urządzenie użytkownika albo serwer usługi, ale weryfikatorem jest zawsze serwer usługi, który porównuje wpisany kod z własnym wynikiem obliczeń albo z zapamiętaną wartością. Skrót OTP oznacza też szyfr z kluczem jednorazowym (one-time pad) i pamięć programowalną jednokrotnie (one-time programmable memory), ale w uwierzytelnianiu chodzi zawsze o hasło jednorazowe.
Jak to działa
Kody jednorazowe powstają dwiema drogami. Pierwsza to generowanie lokalne: urządzenie i serwer znają ten sam tajny klucz, ustalony raz przy włączaniu drugiego składnika, na przykład przez zeskanowanie kodu QR. Klucz nie jest później przesyłany, a oba końce liczą kod niezależnie od siebie. Druga droga to dostarczanie kanałem: serwer losuje kod, zapamiętuje go i wysyła SMS-em albo e-mailem.
Generowanie lokalne opisują dwa dokumenty z serii RFC. RFC 4226 z grudnia 2005 roku definiuje HOTP (HMAC-based One-Time Password). Kod wynika z klucza K i licznika C: HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)). Funkcja obcinająca zamienia wynik HMAC na liczbę, z której bierze się co najmniej sześć cyfr (dokument dopuszcza od sześciu do ośmiu), a każde użycie zwiększa licznik po obu stronach.
Liczniki mogą się rozjechać, na przykład gdy ktoś wygeneruje kod na tokenie bez logowania, dlatego serwer sprawdza kilka kolejnych wartości w oknie wyprzedzenia (parametr s), a po trafieniu synchronizuje licznik. RFC 4226 zaleca też ograniczanie liczby prób, bo krótki kod daje się zgadywać.
RFC 6238 z maja 2011 roku opisuje TOTP (Time-based One-Time Password) jako wariant, w którym licznik zastępuje liczba kroków czasu: T = floor((czas Unix - T0) / X), czyli liczba pełnych kroków. Domyślnie X wynosi 30 sekund, a T0 równa się 0. Domyślną funkcją jest HMAC-SHA-1, a dokument dopuszcza także HMAC-SHA-256 i HMAC-SHA-512.
Zegary urządzenia i serwera się rozchodzą, a wpisanie kodu zajmuje chwilę, dlatego RFC 6238 zaleca dopuszczenie co najwyżej jednego kroku opóźnienia sieciowego. Po udanej weryfikacji serwer może zapisać wykryte przesunięcie zegara tokena i uwzględniać je przy kolejnych kodach.
Kody z SMS-a i e-maila nie mają wzoru, bo serwer losuje je przy każdej prośbie. Czas ważności i liczbę prób ustala wtedy usługa, a opisane wyżej RFC tych kodów nie dotyczą.
Struktura i klasyfikacja
Metody dzielą się według tego, skąd bierze się kod. Kod liczony lokalnie (HOTP, TOTP) powstaje na urządzeniu użytkownika i nie potrzebuje łączności w chwili logowania, a kod dostarczany kanałem (SMS, e-mail) powstaje na serwerze i zależy od drogi, którą dojdzie. Osobny przypadek to powiadomienie push, w którym użytkownik zatwierdza prośbę w aplikacji zamiast przepisywać kod. Ściśle biorąc to nie jest hasło, ale bywa zaliczane do tej samej grupy metod.
| Metoda | Kto tworzy kod | Co wyznacza kolejną wartość | Co może zawieść |
|---|---|---|---|
| HOTP | Token lub aplikacja | Licznik użyć | Rozjazd licznika po kodach wygenerowanych bez logowania |
| TOTP | Aplikacja lub token | Zegar, domyślnie krok 30 s | Rozjazd zegara, utrata telefonu razem z kluczem |
| SMS | Serwer usługi | Losowanie przy każdej prośbie | Zamiana karty SIM i przeniesienie numeru, bo kod trafia do tego, kto kontroluje numer |
| Serwer usługi | Losowanie przy każdej prośbie | Przejęcie skrzynki: kto ją kontroluje, odbiera kody. NIST wyklucza ten kanał z uwierzytelniania | |
| Push | Serwer usługi wysyła prośbę | Zatwierdzenie zamiast kodu | Zatwierdzenie prośby, której użytkownik nie wywołał |
Ocena metod zależy od tego, kogo i przed czym ma chronić drugi składnik, a najważniejszym kryterium jest odporność na phishing.
W szerszym kontekście
OTP to jeden z dowodów z kategorii posiadania w uwierzytelnianiu wieloskładnikowym: użytkownik wykazuje, że ma telefon, token albo dostęp do numeru. Słabość tego dowodu leży poza samym kodem, bo użytkownik wpisuje go ręcznie, a nic w kodzie nie wiąże go z adresem strony, na której został wpisany.
Wykorzystuje to phishing z pośrednikiem, w którym fałszywa strona działa jak przekaźnik, czyli odmiana ataku man in the middle na poziomie aplikacji. Ofiara wpisuje hasło i kod, strona natychmiast przekazuje oba prawdziwej usłudze, a usługa widzi poprawne dane, więc obronie nie pomaga ani szybkość, ani jednorazowość kodu.
Kod wpisany na fałszywej stronie działa tak samo jak na prawdziwej. NIST w publikacji SP 800-63B Revision 4 z sierpnia 2025 roku stwierdza, że uwierzytelnianie kodem OTP nie jest odporne na phishing, a odporność wymaga uwierzytelniania kryptograficznego, na przykład WebAuthn. Zapewniają je FIDO2 i passkey: urządzenie podpisuje wyzwanie serwera, a podpis jest związany z domeną strony, więc podpis wytworzony dla fałszywej domeny nie zadziała w prawdziwej usłudze. Bez kodu do przepisania działa też starszy standard U2F.
Osobną sprawą jest kanał SMS, bo NIST klasyfikuje uwierzytelnianie poza pasmem przez sieć telefoniczną (SMS i połączenie głosowe) jako metodę ograniczoną (restricted). Weryfikator ma wtedy oferować alternatywne typy uwierzytelniaczy i powinien brać pod uwagę wskaźniki ryzyka, takie jak zmiana karty SIM i przeniesienie numeru.
Kod z e-maila NIST wyklucza z uwierzytelniania. Według sekcji 3.1.3.1 e-mail nie może służyć do uwierzytelniania poza pasmem, bo dostęp do skrzynki bywa chroniony samym hasłem, wiadomość można przechwycić w drodze albo na serwerach pośrednich, a ruch przekierować, na przykład przez podszycie się w DNS. Zakaz nie obejmuje kodów potwierdzających adres e-mail ani kodów odzyskiwania konta, bo te nie są uwierzytelnianiem.
Kod z SMS ma więc dwa osobne ograniczenia: tak jak każdy przepisywany kod da się go przekazać fałszywej stronie, a do tego sam kanał podlega ryzyku zamiany karty SIM. TOTP i HOTP mają tylko pierwsze z nich, a FIDO2 i passkey żadnego.
Zastosowanie w praktyce
OTP potwierdza przelewy w bankowości i chroni logowanie do VPN, paneli administracyjnych i poczty. Przydaje się wszędzie tam, gdzie usługa nie oferuje silniejszej metody, bo odcina atak, w którym napastnik zna wyłącznie hasło, na przykład z wycieku bazy danych albo ze zgadywania.
OTP nie wystarcza tam, gdzie przeciwnik prowadzi ukierunkowany atak z pośrednikiem, czyli przy kontach administratorów, kontach uprawnionych do resetowania cudzych dostępów i innych kontach o wysokiej wartości. Tam pierwszym wyborem są klucze FIDO2 albo passkey, a kod OTP zostaje metodą zapasową.
Utrata telefonu oznacza utratę tajnego klucza TOTP, jeśli nie ma jego kopii, dlatego usługi wydają przy włączaniu drugiego składnika kody zapasowe: zestaw kodów jednorazowych, z których każdy działa raz i które przechowuje się poza telefonem, na przykład wydrukowane w bezpiecznym miejscu. Czy klucz da się przenieść na nowe urządzenie, zależy od aplikacji i od usługi. Ścieżka odzyskiwania dostępu sama bywa celem ataku, więc słaba procedura odzyskiwania obniża ochronę najsilniejszego składnika.
Kod jest dowodem, że loguje się właściciel konta, więc rozmówca, który prosi o odczytanie kodu z SMS-a, prosi o drugi składnik logowania. Kod wpisuje się wyłącznie w formularzu usługi, która go wysłała.
Najczęstsze nieporozumienia
- "SMS z kodem to najbezpieczniejsza forma OTP" - nieprawda. Kod z aplikacji nie przechodzi przez sieć operatora, więc nie dotyczy go zamiana karty SIM. SMS ma inną przewagę: działa bez instalowania czegokolwiek. Wciąż jest lepszy niż samo hasło, ale NIST uznaje sam kanał za ograniczony.
- "OTP chroni przed phishingiem" - nieprawda. OTP chroni przed ponownym użyciem przechwyconego kodu po jego wygaśnięciu, ale fałszywa strona, która przekazuje kod od razu, działa w oknie ważności, więc kod jest przyjmowany.
- "Weryfikacja dwuetapowa to to samo co dwuskładnikowa" - nieprawda. Dwa etapy mogą dotyczyć tej samej kategorii, na przykład hasła i pytania pomocniczego, które są wiedzą. Dwa składniki pochodzą z różnych kategorii, na przykład hasło (wiedza) i telefon z aplikacją (posiadanie).
- "Kod z aplikacji wygasa po użyciu" - zależy od weryfikatora. Kod TOTP jest ważny przez swoje okno czasu niezależnie od tego, czy ktoś go użył. Jednorazowość wymusza serwer: RFC 6238 stanowi, że weryfikator nie może przyjąć drugiej próby tego samego kodu po udanej weryfikacji. Usługa, która tego nie robi, przyjmuje ten sam kod wielokrotnie w jednym oknie.
FAQ
Co to jest OTP?
OTP to jednorazowe hasło, czyli kod, który system przyjmuje tylko przy jednym logowaniu albo przez kilkadziesiąt sekund. Dopełnia hasło jako drugi składnik uwierzytelniania. Kod tworzy aplikacja, token albo serwer usługi, a weryfikuje go zawsze serwer. Samo OTP nie zastępuje hasła i nie chroni przed fałszywą stroną.
Co to jest kod OTP i skąd go wziąć?
Kod OTP to ciąg cyfr, najczęściej sześciu, który wpisuje się po haśle. Źródło zależy od konfiguracji usługi: aplikacja uwierzytelniająca, token sprzętowy, SMS albo e-mail. Kod z nieoczekiwanej wiadomości może oznaczać, że ktoś zna login i hasło do konta, więc hasło warto zmienić. Kodu nie podaje się nikomu przez telefon ani w czacie.
Czym różni się TOTP od HOTP?
HOTP (RFC 4226) liczy kod z klucza i licznika, który rośnie z każdym użyciem, więc kod pozostaje ważny aż do następnego użycia. TOTP (RFC 6238) liczy kod z klucza i czasu, domyślnie w krokach po 30 sekund, więc kod wygasa bez użycia. HOTP grozi rozjazd licznika, TOTP rozjazd zegara.
Czy SMS z kodem OTP jest bezpieczny?
Dodaje drugi składnik do hasła, ale należy do metod ograniczonych. Kod trafia do tego, kto kontroluje numer, więc ryzykiem jest zamiana karty SIM i przeniesienie numeru. Przepisany kod można też przekazać fałszywej stronie. NIST wymaga od weryfikatorów, żeby oferowali alternatywę dla tego kanału.
Czy OTP chroni przed phishingiem?
Nie. Kod wpisany na fałszywej stronie może zostać natychmiast przekazany prawdziwej usłudze, która przyjmie go w oknie ważności. Odporność na phishing wymaga uwierzytelniania kryptograficznego, w którym podpis jest związany z domeną strony, jak w FIDO2 i passkey.
Powiązane pojęcia
- MFA - uwierzytelnianie wieloskładnikowe, w którym OTP pełni rolę składnika posiadania.
- FIDO2 - standard uwierzytelniania kryptograficznego z podpisem związanym z domeną, odporny na przekazanie kodu.
- Passkey - logowanie parą kluczy zamiast hasła, bez kodu do przepisania.
- U2F - starszy standard klucza sprzętowego jako drugiego składnika.
- Phishing - atak, który nakłania do wpisania hasła i kodu na fałszywej stronie.
Bezpieczeństwo infrastruktury
Znajdziesz tu powiązane pojęcia dotyczące uwierzytelniania i ochrony dostępu.