Sådan tjekker Luhn-algoritmen om et kreditkortnummer er gyldigt
Luhn-algoritmen er den kontrolsum, som afgør om et kreditkortnummer er matematisk muligt, før nogen bank overhovedet bliver spurgt. Man fordobler hvert andet ciffer fra højre mod venstre, trækker 9 fra hvis resultatet bliver tocifret, lægger alle cifrene sammen, og hvis summen går op i 10, er nummeret gyldigt opbygget. Det er præcis den samme regel, som Visa, Mastercard og alle andre kortnetværk bruger til at fange en tastefejl, inden en betaling sendes videre.
Reglen, kort og præcist
- Start med det yderste højre ciffer. Det tælles ikke med, det er udgangspunktet.
- Gå mod venstre og fordobl hvert andet ciffer (position 2, 4, 6 og så videre fra højre).
- Bliver et fordoblet ciffer tocifret (f.eks. 8 × 2 = 16), trækkes 9 fra, så 16 bliver til 7. Det svarer til at lægge de to cifre i resultatet sammen (1+6=7).
- Læg alle cifrene sammen: både de fordoblede (og evt. justerede) og dem, der stod urørt.
- Er totalen delelig med 10, er nummeret Luhn-gyldigt. Ellers er det ikke.
Det er hele metoden. Ingen hemmelig nøgle, ingen adgang til en database, bare en fast regnestykke som ethvert system, lige fra en kasseterminal til en betalingsformular i en netbutik, kan udføre lokalt på et brøkdels sekund.
Regneeksempel: sådan tjekkes et rigtigt kortnummer trin for trin
Tag det mest kendte offentlige testnummer for Visa, som udviklere bruger verden over:
4111 1111 1111 1111
Det er 16 cifre. Talt fra højre er det yderste ciffer position 1, og det yderste venstre ciffer (det indledende 4) er dermed position 16. Da 16 er lige, bliver netop det 4-tal fordoblet.
| Ciffer | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Position (fra højre) | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| Fordobles? | ja | nej | ja | nej | ja | nej | ja | nej | ja | nej | ja | nej | ja | nej | ja | nej |
| Værdi efter reglen | 8 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
Ingen af de fordoblede etaller bliver tocifrede (1 × 2 = 2), så der er ingen fradrag af 9 nogen steder undtagen implicit i selve fordoblingen af 4-tallet, som ender under 10 alligevel (4 × 2 = 8).
Lægges de otte fordoblede værdier og de otte urørte værdier sammen: de syv fordoblede etaller giver 7 × 2 = 14, det fordoblede 4-tal giver 8, og de otte urørte etaller på ulige positioner giver 8. Samlet:
14 + 8 + 8 = 30
30 er delelig med 10, så 4111 1111 1111 1111 består Luhn-tjekket. Det stemmer med virkeligheden: det er netop derfor, dette nummer er blevet standardtestnummeret for Visa i utallige betalingsintegrationer.
Hvorfor ét enkelt tastet ciffer vælter hele tjekket
Se nu, hvad der sker, hvis man taster forkert på allersidste ciffer, en klassisk fumlefinger-fejl, og skriver 4111 1111 1111 1112 i stedet:
Det sidste ciffer sidder på position 1, som ikke fordobles, så det tæller direkte med sin egen værdi. Oprindeligt bidrog det med 1 til summen. Nu bidrager det med 2. Resten af nummeret er uændret, så den samlede sum stiger fra 30 til 31.
31 er ikke delelig med 10. Kontrollen fejler med det samme, uden at nogen bank, betalingsgateway eller netværk overhovedet behøver blive spurgt. Det er præcis den funktion, Luhn-tjekket er designet til: at stoppe en oplagt tastefejl, før den bruger en eneste anmodning på et rigtigt betalingssystem.
Kendte testnumre pr. netværk
Disse numre er offentligt kendte og bruges rutinemæssigt i dokumentationen hos betalingsudbydere som Stripe og PayPal til at teste checkout-flows uden at røre et rigtigt kort. De er trygge at bruge og dele, fordi de aldrig er koblet til en rigtig konto.
| Netværk | Testnummer | Luhn-gyldigt |
|---|---|---|
| Visa | 4111 1111 1111 1111 | Ja |
| Visa (alternativ) | 4012 8888 8888 1881 | Ja |
| Mastercard | 5555 5555 5555 4444 | Ja |
| American Express | 3782 822463 10005 | Ja |
| Discover | 6011 1111 1111 1117 | Ja |
Læg mærke til, at American Express bryder mønsteret med sine 15 cifre og en anden gruppering (4-6-5 i stedet for det sædvanlige 4-4-4-4). Luhn-algoritmen bekymrer sig ikke om, hvordan tallet er inddelt visuelt, kun om selve ciffersekvensen.
Prøv med dit eget kortnummer
Indtast et nummer herunder og se med det samme, om det består Luhn-tjekket, og hvilket netværk det tilhører ud fra præfikset og længden.
Hvad Luhn-tjekket ikke fortæller dig
Et Luhn-gyldigt nummer beviser kun én ting: at ciffersekvensen er matematisk sammensat efter reglen. Det siger absolut intet om, hvorvidt kortet:
- Faktisk eksisterer og er udstedt af en bank
- Er aktivt og ikke spærret eller udløbet
- Har dækning eller tilgængelig kredit til betalingen
Den bekræftelse kan udelukkende gives af den udstedende bank selv, typisk gennem en autorisationsforespørgsel, når betalingen rent faktisk forsøges gennemført. Luhn-tjekket er et filter, der sidder foran den proces, ikke en erstatning for den. Det er derfor testnumrene ovenfor virker fint i et sandbox-miljø uden at være koblet til en eneste rigtig konto: de består formkravet, men rører aldrig et ægte banksystem.
Almindelige fejl og en kendt blind vinkel
Luhn-algoritmen er god, men ikke perfekt, og det er værd at kende dens grænser i stedet for at behandle den som en fuldstændig garanti.
Den fanger stort set alle enkeltcifferfejl, altså tilfælde hvor ét ciffer bliver tastet forkert, som i eksemplet ovenfor. Den fanger også langt de fleste tilfælde, hvor to nabocifre bytter plads ved et uheld.
Men der findes en dokumenteret blind vinkel: ombytning af to nabocifre, hvis forskel er præcis 9. I praksis betyder det, at ombytter man et 0 og et 9, der står ved siden af hinanden, ændrer det slet ikke kontrolsummen. Nummeret består stadig tjekket, selvom cifrene reelt står i forkert rækkefølge. Det er en velkendt matematisk egenskab ved metoden, ikke en fejl i implementeringen, og grunden til at Luhn kun bruges som et første, hurtigt filter og aldrig som den eneste sikkerhedskontrol i et betalingssystem.
En anden almindelig misforståelse er at tro, at Luhn-tjekket er specifikt for kreditkort. Det er det ikke. Den samme formel bruges også til IMEI-numre på mobiltelefoner og til visse nationale identifikationsnumre, netop fordi den er så enkel at implementere og god til at fange almindelige indtastningsfejl generelt.
Ofte stillede spørgsmål
Hvad er Luhn-algoritmen egentlig, og hvem opfandt den? Det er en simpel kontrolsumsformel opkaldt efter Hans Peter Luhn, en IBM-ingeniør, der patenterede metoden i 1954. Den bruges i dag som standard checksum for kreditkortnumre verden over, netop fordi den er let at regne selv i hånden og alligevel fanger de fleste indtastningsfejl.
Betyder et Luhn-gyldigt nummer, at kortet rent faktisk findes og har penge på sig? Nej. Det beviser kun, at ciffersekvensen er bygget matematisk korrekt efter reglen. Om kortet er udstedt, aktivt og har tilstrækkelig kredit, kan udelukkende bekræftes af den udstedende bank, typisk i forbindelse med selve betalingsforsøget.
Hvorfor bruger udviklere altid de samme testnumre som 4111 1111 1111 1111? Fordi disse numre er offentligt dokumenteret af betalingsudbydere netop til testformål. De består Luhn-tjekket og genkendes korrekt som det pågældende netværk, men er aldrig koblet til en rigtig konto, så de kan bruges trygt i et sandbox-miljø uden risiko for at ramme et rigtigt banksystem.
Fanger Luhn-tjekket virkelig enhver tastefejl? Næsten, men ikke alle. Det fanger stort set alle enkeltcifferfejl og de fleste ombytninger af nabocifre. Den ene kendte undtagelse er en ombytning af to nabocifre, hvor forskellen mellem dem er præcis 9 (altså en 0 og en 9 ved siden af hinanden), som giver samme kontrolsum og derfor slipper igennem uopdaget.
Er et kortnummer, der består Luhn-tjekket, sikkert at bruge til en rigtig betaling? Nej, og det er heller ikke pointen med tjekket. Luhn-tjekket bekræfter kun formatet. Om et rigtigt betalingsforsøg lykkes, afhænger af helt andre faktorer hos den udstedende bank: om kortet er aktivt, om udløbsdatoen og CVV-koden stemmer, og om der er dækning til beløbet.