Jak działa algorytm Luhna: suma kontrolna numeru karty krok po kroku
Algorytm Luhna to prosta suma kontrolna wbudowana w każdy numer karty płatniczej. Podwaja co drugą cyfrę licząc od prawej, sumuje wszystkie cyfry i sprawdza, czy wynik dzieli się przez 10. Jeśli tak, numer jest zbudowany poprawnie. Dzięki temu przeglądarka albo formularz płatności wyłapuje literówkę w numerze karty w ułamku sekundy, zanim dane w ogóle dotrą do banku.
Zasada w skrócie
Reguła ma trzy kroki, zawsze wykonywane od ostatniej cyfry numeru w stronę pierwszej:
- Podwój co drugą cyfrę. Zaczynasz od ostatniej cyfry (to ona zostaje nietknięta) i idziesz w lewo, podwajając co drugą cyfrę po drodze.
- Skoryguj dwucyfrowe wyniki. Jeśli podwojenie da liczbę dwucyfrową (np. 8×2=16), odejmujesz od niej 9. To dokładnie to samo co zsumowanie obu cyfr wyniku (1+6=7, a 16-9 też daje 7).
- Zsumuj wszystko i sprawdź resztę z dzielenia przez 10. Dodajesz cyfry niepodwojone oraz skorygowane cyfry podwojone. Jeśli suma jest wielokrotnością 10, numer przechodzi test.
To wszystko. Żadnej kryptografii, żadnego sekretnego klucza, tylko arytmetyka, którą liczy się w pamięci przy odrobinie wprawy. Właśnie dlatego każda przeglądarka i każdy formularz płatności może to sprawdzić lokalnie, bez łączenia się z bankiem.
Przykład krok po kroku na prawdziwym numerze
Weźmy dobrze znany, publicznie udostępniony numer testowy Visa, którego używa się na całym świecie w środowiskach sandbox: 4111 1111 1111 1111. To nie jest numer żadnej realnej karty, to standardowa wartość testowa polecana w dokumentacji Stripe, PayPal i większości bramek płatniczych.
Numer ma 16 cyfr. Licząc pozycje od prawej (ostatnia cyfra to pozycja 1), podwajane są wszystkie pozycje parzyste: 2, 4, 6, 8, 10, 12, 14 i 16. Skoro cyfr jest 16, czyli liczba parzysta, podwojeniu podlega też sama pierwsza cyfra numeru, czyli “4” na samym początku.
| Grupa cyfr | Ile cyfr | Wartość każdej | Po podwojeniu / korekcie | Suma grupy |
|---|---|---|---|---|
| Siedem “1” na pozycjach parzystych (bez pierwszej cyfry) | 7 | 1 | 1×2=2 (bez korekty, wynik poniżej 10) | 7×2 = 14 |
| Pierwsza cyfra “4” (pozycja 16, parzysta) | 1 | 4 | 4×2=8 (bez korekty) | 8 |
| Osiem “1” na pozycjach nieparzystych (niepodwajanych) | 8 | 1 | bez zmian | 8 |
Suma końcowa: 14 + 8 + 8 = 30. Trzydzieści dzieli się przez 10 bez reszty, więc numer przechodzi test Luhna. To się zgadza z rzeczywistością: 4111111111111111 rzeczywiście jest poprawnym, aktywnym numerem testowym Visy w każdej bramce płatniczej, która go obsługuje.
Dlaczego jedna pomyłkowa cyfra psuje cały numer
Zobaczmy, co się dzieje, gdy ktoś pomyli się przy przepisywaniu ostatniej cyfry i zamiast 4111 1111 1111 1111 wpisze 4111 1111 1111 1112. To klasyczny błąd “przesuniętego palca” na klawiaturze numerycznej.
Ostatnia cyfra siedzi na pozycji 1 licząc od prawej, czyli akurat na pozycji, która nigdy nie jest podwajana, więc wchodzi do sumy w swojej surowej wartości. W oryginalnym numerze ta cyfra wnosiła do sumy wartość 1. Po literówce wnosi wartość 2, czyli o jeden więcej. Cała reszta numeru się nie zmieniła, więc nowa suma to 30 + 1 = 31.
31 nie dzieli się przez 10, więc test Luhna od razu zgłasza błąd, zanim formularz w ogóle wyśle dane do serwera. Dokładnie to jest sens tego mechanizmu: łapie literówkę lokalnie, w przeglądarce użytkownika, ułamek sekundy po naciśnięciu klawisza, zamiast dopiero po rundzie w obie strony do bramki płatniczej i z powrotem.
Znane numery testowe według sieci kartowej
Kilka publicznie znanych numerów testowych, których używają deweloperzy i testerzy QA do sprawdzania integracji z bramkami płatniczymi (m.in. w dokumentacji Stripe i PayPal). Wszystkie przechodzą test Luhna, ale żaden nie odpowiada realnemu, obciążalnemu kontu:
| Sieć kartowa | Numer testowy |
|---|---|
| Visa | 4111 1111 1111 1111 |
| Visa (alternatywny) | 4012 8888 8888 1881 |
| Mastercard | 5555 5555 5555 4444 |
| American Express | 3782 822463 10005 |
| Discover | 6011 1111 1111 1117 |
Warto zwrócić uwagę na numer American Express: ma tylko 15 cyfr zamiast 16, a jego grupowanie w dokumentacji zwykle wygląda inaczej (4-6-5 zamiast 4-4-4-4). To normalna cecha tej sieci, nie błąd zapisu, Amex od zawsze używa krótszego formatu numeru.
Wypróbuj z własnym numerem
Wklej dowolny numer karty poniżej. Narzędzie rozpozna sieć kartową na podstawie prefiksu i pokaże na żywo, czy numer przechodzi sumę kontrolną Luhna, dokładnie według kroków opisanych wyżej.
Czego test Luhna NIE potwierdza
To najważniejsze zastrzeżenie w całym tym temacie i warto je zapamiętać. Pozytywny wynik testu Luhna dowodzi wyłącznie, że numer jest zbudowany zgodnie ze wzorem matematycznym. Nie dowodzi, że:
- karta o takim numerze w ogóle istnieje,
- karta jest aktywna i nie została zablokowana,
- na karcie są dostępne środki lub limit kredytowy,
- numer należy do konkretnej, prawdziwej osoby.
Można wygenerować losowy, zmyślony numer, który matematycznie spełnia regułę Luhna, a mimo to nie odpowiada żadnemu realnemu kontu w żadnym banku. Dlatego formularze płatności nigdy nie kończą weryfikacji na samym Luhnie. To pierwszy, najtańszy filtr, uruchamiany lokalnie w przeglądarce, zanim dane w ogóle opuszczą urządzenie użytkownika. Ostateczne potwierdzenie, czy karta istnieje i ma pokrycie, wydaje wyłącznie bank wydający kartę, w momencie autoryzacji transakcji.
Częste błędy i przypadki szczególne
Luhn nie jest nieomylny. Wykrywa zdecydowaną większość pojedynczych literówek i większość przypadkowych przestawień sąsiednich cyfr, ale ma jedną dobrze udokumentowaną lukę: zamiana miejscami dwóch sąsiadujących cyfr, których różnica wynosi dokładnie 9 (czyli w praktyce zamiana 0 i 9 stojących obok siebie), daje dokładnie taką samą sumę kontrolną. Taki błąd przechodzi test niezauważony. To rzadki przypadek w praktyce, ale warto go znać, zwłaszcza budując własną walidację formularza, żeby nie zakładać, że przejście testu Luhna równa się stuprocentowej pewności poprawnego numeru.
Mylenie długości numeru z jego poprawnością. Różne sieci kartowe mają różną liczbę cyfr (Amex ma 15, większość pozostałych ma 16), więc numer o nietypowej długości dla danej sieci jest podejrzany niezależnie od tego, czy przypadkiem przeszedłby sumę kontrolną.
Traktowanie Luhna jako zabezpieczenia przed oszustwami. To nie jest mechanizm antyfraudowy, tylko test integralności danych wejściowych. Prawdziwe zabezpieczenia (3D Secure, kod CVV, weryfikacja przez bank wydający) działają na zupełnie innym poziomie i dopiero one odpowiadają za bezpieczeństwo transakcji.
Najczęściej zadawane pytania
Czy każda karta płatnicza na świecie używa algorytmu Luhna? Tak, praktycznie wszystkie główne sieci kartowe, w tym Visa, Mastercard, American Express i Discover, wymagają, żeby numer karty spełniał regułę Luhna. To standard opisany w normie ISO/IEC 7812, przyjęty branżowo na tyle szeroko, że każda poważna biblioteka do walidacji numerów kart go implementuje.
Czy mogę użyć tych numerów testowych do prawdziwych zakupów? Nie. Te numery są celowo publiczne i powszechnie znane, dokumentacja Stripe, PayPal i innych bramek podaje je wprost jako dane testowe. Żadna realna bramka płatnicza nie zrealizuje nimi prawdziwej transakcji poza trybem sandbox, bo nie odpowiadają żadnemu aktywnemu kontu z realnym pokryciem.
Dlaczego mój numer karty przeszedł test Luhna, a mimo to płatność została odrzucona? Bo to dwie zupełnie różne rzeczy. Luhn sprawdza tylko, czy numer jest poprawnie skonstruowany matematycznie. Odrzucenie płatności może wynikać z braku środków, wygasłej daty ważności, złego kodu CVV, blokady banku albo systemu antyfraudowego bramki. Poprawna suma kontrolna to warunek konieczny, żeby numer w ogóle dało się przetworzyć, ale nie warunek wystarczający do zatwierdzenia płatności.
Czy da się oszukać algorytm Luhna, wymyślając losowy numer karty? Owszem, technicznie da się wygenerować dowolną liczbę losowych numerów, które spełniają regułę Luhna, bo to prosta zależność matematyczna, a nie szyfrowanie. Właśnie dlatego sam Luhn nigdy nie jest jedynym zabezpieczeniem systemu płatności. Realne konto z realnym pokryciem może potwierdzić wyłącznie bank wydający kartę podczas autoryzacji.