Slik Fungerer Luhn-Algoritmen for Kredittkortnummer
Et gyldig kredittkortnummer er ikke en tilfeldig sifferrekke. De siste sifrene fungerer som en kontrollsum regnet ut med Luhn-algoritmen, og den avslører de aller fleste tastefeil før en betaling i det hele tatt når banken. Doble annenhver siffer fra høyre, trekk fra 9 hvis resultatet blir tosifret, summer alt, og se om summen er delelig med 10.
Regelen, kort og presist
Start fra det ytterste sifferet til høyre og gå mot venstre. Doble annenhver siffer, altså siffer nummer 2, 4, 6 og så videre regnet fra høyre. Blir dobling et tosifret tall (for eksempel 8 × 2 = 16), trekk fra 9, som gir samme resultat som å summere de to sifrene i tallet (1 + 6 = 7, og 16 − 9 = 7). Legg sammen alle sifrene, både de urørte og de justerte, til én total. Er totalen et multiplum av 10, er nummeret Luhn-gyldig.
Det er hele algoritmen. Ingen hemmelig nøkkel, ingen kobling til banken, bare et regnestykke hvem som helst kan gjøre for hånd på ti sekunder.
Regneeksempel: å sjekke et ekte kortnummer steg for steg
Det klassiske Visa-testnummeret 4111 1111 1111 1111 er offentlig kjent og trygt å bruke i eksempler, det er laget nettopp for testing og tilhører ingen ekte kortholder. Det har 16 sifre, så telt fra høyre er posisjon 16 (det aller første sifferet, 4-tallet) en av de posisjonene som skal dobles, siden 16 er et partall.
| Posisjon (fra høyre) | Siffer | Dobles? | Bidrag |
|---|---|---|---|
| 16 | 4 | Ja | 4 × 2 = 8 |
| 15 | 1 | Nei | 1 |
| 14 | 1 | Ja | 1 × 2 = 2 |
| 13 | 1 | Nei | 1 |
| 12 | 1 | Ja | 1 × 2 = 2 |
| 11 | 1 | Nei | 1 |
| 10 | 1 | Ja | 1 × 2 = 2 |
| 9 | 1 | Nei | 1 |
| 8 | 1 | Ja | 1 × 2 = 2 |
| 7 | 1 | Nei | 1 |
| 6 | 1 | Ja | 1 × 2 = 2 |
| 5 | 1 | Nei | 1 |
| 4 | 1 | Ja | 1 × 2 = 2 |
| 3 | 1 | Nei | 1 |
| 2 | 1 | Ja | 1 × 2 = 2 |
| 1 | 1 | Nei | 1 |
De sju enerne på de doblede posisjonene gir 2 hver, altså 7 × 2 = 14. Firetallet på posisjon 16 er også doblet og blir 8 (4 × 2 = 8, ingen justering nødvendig siden resultatet er under 10). De åtte enerne på de ikke-doblede posisjonene summerer til 8. Total: 14 + 8 + 8 = 30.
30 er delelig med 10, så nummeret er Luhn-gyldig. Det stemmer med virkeligheten: 4111 1111 1111 1111 er nettopp et godkjent Visa-testnummer i praktisk bruk hos utviklere verden over.
Hvorfor én eneste tastefeil får kontrollen til å feile
Ta samme nummer, men endre bare det aller siste sifferet fra 1 til 2: 4111 1111 1111 1112, den typen glipp som skjer når fingeren treffer nabotasten på slutten av en lang rekke tall.
Det siste sifferet står på posisjon 1 fra høyre, en posisjon som ikke dobles, så det telles med sin egentlige verdi direkte inn i summen. Opprinnelig bidro det med 1, nå bidrar det med 2, altså én mer enn før. Totalen blir 30 + 1 = 31.
31 er ikke delelig med 10, så kontrollen feiler umiddelbart. Verktøyet markerer nummeret som ugyldig før noe skjema sendes videre, uten at det trengs noen forespørsel til en bank eller et betalingsnettverk. Det er hele poenget med Luhn: én endret siffer flytter nesten alltid totalen bort fra et multiplum av 10, og feilen fanges lokalt, i millisekunder.
Kjente testnumre per kortnettverk
Disse numrene brukes offisielt av betalingsleverandører som Stripe og PayPal i sin egen testdokumentasjon. De er trygge å publisere og inneholder ingen ekte kontoinformasjon, men de følger den samme Luhn-strukturen som ekte kortnumre og lar deg teste et betalingsskjema uten å røre et virkelig kort.
| Nettverk | Testnummer | Sifre |
|---|---|---|
| Visa | 4111 1111 1111 1111 | 16 |
| Visa (alternativ) | 4012 8888 8888 1881 | 16 |
| Mastercard | 5555 5555 5555 4444 | 16 |
| American Express | 3782 822463 10005 | 15 |
| Discover | 6011 1111 1111 1117 | 16 |
Legg merke til at American Express bryter med 16-siffer-mønsteret og bruker 15 sifre gruppert 4-6-5 i stedet for 4-4-4-4. Det er en av grunnene til at en god validator alltid sjekker kortnettverket fra prefikset før den antar noe om lengden på nummeret.
Test med ditt eget nummer
Lim inn et hvilket som helst kortnummer under (gjerne et av testnumrene over), så kjøres nøyaktig samme Luhn-utregning direkte i nettleseren din. Ingenting sendes til noen server.
Hva Luhn-kontrollen ikke forteller deg
En godkjent Luhn-sjekk beviser bare at nummeret er matematisk bygget opp riktig, altså at det kunne vært et ekte kort. Den sier ingenting om hvorvidt kortet faktisk finnes, om det er aktivt, om det har dekning, eller om det tilhører den personen som oppgir det. Det kan kun den utstedende banken bekrefte, gjennom en autorisasjonsforespørsel som skjer et helt annet sted i betalingskjeden enn denne enkle sifferkontrollen.
Det er nettopp derfor Luhn brukes akkurat der den brukes: som et første, billig filter i selve nettleseren eller betalingsskjemaet, lenge før noen kobler seg til banken. En falsk sjekksum stopper åpenbare tastefeil med det samme. Alt annet, om kortet faktisk kan belastes, avgjøres av banken.
Vanlige feil og et kjent blindspot
Å tro at Luhn fanger enhver mulig feil. Det gjør den ikke. Algoritmen er svært god på enkeltsifferfeil, akkurat som eksempelet over viser, og den fanger de aller fleste tilfeller der to naboliggende sifre bytter plass. Men det finnes ett kjent unntak: bytter man om to naboliggende sifre der differansen mellom dem er nøyaktig 9, altså et 0 og et 9 ved siden av hverandre, gir det akkurat samme kontrollsum som originalen. Feilen glipper gjennom usett. Dette er en reell og dokumentert svakhet ved algoritmen, ikke en teoretisk skremselshistorie, men den rammer et smalt og spesifikt tilfelle, ikke tastefeil generelt.
Å bruke et ekte kortnummer i test- eller demomiljø. Bruk alltid de offisielle testnumrene fra tabellen over. De er designet nettopp for dette formålet av betalingsleverandørene selv.
Å anta at kortnummerets lengde alltid er 16. Som American Express-eksempelet viser, varierer lengden mellom nettverk. Sjekk alltid prefikset for å identifisere nettverket før du validerer strukturen.
Å forveksle en Luhn-godkjenning med en vellykket betaling. Et skjema som aksepterer nummeret ditt lokalt har bare bestått det første, enkleste filteret. Selve betalingen kan fortsatt avvises av banken av mange andre grunner, manglende dekning, utløpt kort, eller at kortet er sperret.
Ofte stilte spørsmål
Hvorfor bruker betalingsnettverk Luhn-algoritmen i det hele tatt? Fordi den er ekstremt billig å kjøre og fanger opp det aller vanligste problemet med kortnumre: en menneskelig tastefeil. Ved å sjekke sifrene lokalt i nettleseren eller på klientsiden slipper man en unødvendig runde til banken for et nummer som uansett aldri kunne vært gyldig. Det sparer tid for brukeren og belastning for betalingsinfrastrukturen.
Beviser en godkjent Luhn-sjekk at kortet er ekte? Nei. Den beviser bare at sifrene er strukturert riktig matematisk. Om kortet faktisk finnes, er aktivt, har dekning eller tilhører riktig person, er noe kun den utstedende banken kan bekrefte gjennom en egen autorisasjonsforespørsel.
Hvorfor har American Express 15 sifre når de fleste andre kort har 16? Fordi hvert kortnettverk definerte sitt eget nummerformat før noen felles standard fantes, og disse formatene har blitt værende av kompatibilitetshensyn. American Express bruker 15 sifre gruppert 4-6-5, mens Visa, Mastercard og Discover bruker 16 sifre gruppert 4-4-4-4. Luhn-algoritmen fungerer likt uansett lengde, den regner bare gjennom det antallet sifre som faktisk finnes.
Kan jeg bruke Luhn-algoritmen til å generere gyldige kortnumre? Teknisk sett ja, man kan regne ut hvilket siffer som må stå sist for at summen skal bli delelig med 10, og det er nøyaktig slik det siste sifferet i ekte kortnumre blir bestemt av utstederen. Men et Luhn-gyldig nummer er likevel ikke et ekte, brukbart kort. De første sifrene (BIN-nummeret) må også tilhøre en reell utsteder, og selve kontoen må eksistere hos banken. Bruk alltid de offisielle testnumrene fra tabellen over til testing.