Financiën

Hoe het Luhn-Algoritme Creditcardnummers Controleert

7 min leestijd

Het Luhn-algoritme is de rekensom waarmee Visa, Mastercard en de meeste andere kaartnetwerken checken of een creditcardnummer wiskundig klopt, nog voordat er een verbinding met de bank wordt gelegd. Verdubbel om de beurt cijfers vanaf rechts, tel alles op, en de uitkomst moet deelbaar zijn door 10. Klopt dat niet, dan is er ergens een cijfer fout getypt.

De regel, kort en precies

Begin bij het meest rechtse cijfer van het kaartnummer en werk naar links. Verdubbel elk tweede cijfer (dus positie 2, 4, 6 en zo verder, geteld vanaf rechts). Levert die verdubbeling een getal van twee cijfers op, trek er dan 9 vanaf (dat komt op hetzelfde neer als de twee cijfers bij elkaar optellen: 8 × 2 = 16, en 1 + 6 = 7, precies wat 16 − 9 ook oplevert). Tel daarna alle cijfers bij elkaar op, zowel de onaangeraakte als de aangepaste. Is de totaalsom een veelvoud van 10, dan is het nummer Luhn-geldig.

Dat is de hele regel. Geen geheime sleutel, geen bankgegevens nodig, alleen optellen en om-de-beurt verdubbelen.

Stap voor stap: een echt kaartnummer natellen

Neem het bekende publieke Visa-testnummer 4111 1111 1111 1111. Dit is geen bestaande klantkaart, maar een testwaarde die ontwikkelaars wereldwijd gebruiken in sandboxomgevingen van bijvoorbeeld Stripe en PayPal.

Het nummer telt 16 cijfers. Omdat 16 een even getal is, wordt het meest linkse cijfer (positie 16 vanaf rechts geteld) ook verdubbeld.

Positie (vanaf rechts)CijferVerdubbeld?Bijdrage aan de som
16 (meest links)4ja4 × 2 = 8
15 t/m 2, oneven posities (8 cijfers)1nee1 × 8 = 8
15 t/m 2, even posities (7 cijfers)1ja(1 × 2 = 2) × 7 = 14
1 (meest rechts)1neeal meegeteld bij de oneven posities

Tel de drie kolommen bij elkaar op: 8 (het verdubbelde eerste cijfer) plus 8 (de acht enen op de niet-verdubbelde posities) plus 14 (de zeven enen die wel verdubbeld worden, elk 1 × 2 = 2). Dat geeft 8 + 8 + 14 = 30.

30 is deelbaar door 10, dus 4111 1111 1111 1111 is Luhn-geldig. Dat komt overeen met de werkelijkheid: dit is inderdaad een geldig, algemeen bekend Visa-testnummer.

Waarom één verkeerd getypt cijfer meteen opvalt

Hier zit de echte waarde van Luhn: het vangt tikfouten af voordat er ook maar één netwerkverzoek de deur uit gaat. Neem hetzelfde nummer, maar verander het allerlaatste cijfer van 1 naar 2, een klassieke verschrijving bij het intypen van een lang nummer: 4111 1111 1111 1112.

Dat laatste cijfer staat op positie 1 vanaf rechts, dus het wordt niet verdubbeld en telt gewoon met zijn eigen waarde mee. Waar het origineel op die plek een 1 bijdroeg, draagt de gewijzigde versie een 2 bij. De totaalsom stijgt dus van 30 naar 31.

31 is geen veelvoud van 10. De check faalt, en een kassasysteem of betaalformulier kan dat nummer direct als ongeldig markeren, zonder dat er een aanvraag bij de bank of het kaartnetwerk nodig is. Dat is precies waarom Luhn bestaat: het is een goedkope, razendsnelle eerste zeef voordat iets duurders (een echte autorisatie-aanvraag) in gang wordt gezet.

Bekende testnummers per netwerk

Elk kaartnetwerk publiceert eigen testnummers die Luhn-geldig zijn maar nooit aan een echte rekening gekoppeld worden. Ontwikkelaars gebruiken ze dagelijks om betaalformulieren te testen zonder een echte kaart te hoeven gebruiken.

NetwerkTestnummerCijfers
Visa4111 1111 1111 111116
Visa (alternatief)4012 8888 8888 188116
Mastercard5555 5555 5555 444416
American Express3782 822463 1000515
Discover6011 1111 1111 111716

Let op de afwijkende groepering bij American Express: 15 cijfers in blokken van 4-6-5 in plaats van de gebruikelijke 4-4-4-4. Dat is geen fout, het is gewoon hoe Amex zijn nummers opbouwt, en een validator die daar geen rekening mee houdt, wijst geldige Amex-kaarten onterecht af.

Probeer het met je eigen nummer

Plak een van de testnummers hierboven, of typ zelf een nummer met een fout erin, en zie het kaartnetwerk en de Luhn-uitkomst meteen verschijnen.

Kaartnetwerk -
Luhn-controle -

Wat Luhn je niet vertelt

Een geslaagde Luhn-check bewijst alleen dat een nummer volgens de rekenregel is opgebouwd. Het zegt niets over of de kaart daadwerkelijk bestaat, actief is, nog geldig binnen de looptijd valt, of voldoende saldo of kredietruimte heeft. Die informatie zit uitsluitend bij de uitgevende bank, en komt pas naar boven bij een echte autorisatie-aanvraag via het kaartnetwerk.

Voor een ontwikkelaar die een betaalformulier bouwt, is dat onderscheid direct bruikbaar: als een testtransactie wordt geweigerd, is de eerste vraag niet “is er een bug in mijn code”, maar “is dit testnummer Luhn-geldig, en zo ja, wijst de sandbox het om een andere reden af”. Luhn filtert alleen de categorie fouten die met tikfouten en veldvalidatie te maken hebben, niets meer.

Veelgemaakte fouten en een bekende blinde vlek

De meest voorkomende misvatting is denken dat een Luhn-geldig nummer een werkend nummer is. Dat is dus niet zo, zoals hierboven al bleek: Luhn controleert enkel de opbouw, niet het bestaan van de kaart.

Een tweede fout is vergeten dat het aantal cijfers bepaalt of het eerste cijfer wel of niet wordt verdubbeld. Bij een even aantal cijfers (zoals de 16 van Visa en Mastercard) wordt het meest linkse cijfer verdubbeld, bij een oneven aantal (zoals de 15 van Amex) juist niet. Wie die regel verkeerd toepast op een kort of ongebruikelijk kaartformaat, krijgt een verkeerde uitkomst, ook al is de rest van de berekening correct.

De derde, en minst bekende, is de blinde vlek van Luhn zelf: het algoritme mist niet elke fout. Specifiek geldt dat het verwisselen van twee naast elkaar liggende cijfers waarvan het verschil precies 9 is (in de praktijk dus een 0 en een 9 die van plaats wisselen) exact dezelfde controlesom oplevert. Zo’n verwisseling glipt onopgemerkt door de check heen. Het gaat om een randgeval dat zelden voorkomt, maar het is een bekende, gedocumenteerde eigenschap van het algoritme en geen fabeltje. Luhn vangt de overgrote meerderheid van tikfouten en verwisselingen af, maar niet elke denkbare fout.

Veelgestelde vragen

Is het Luhn-algoritme hetzelfde als encryptie of beveiliging? Nee. Luhn is een eenvoudige controlesom, bedoeld om invoerfouten te ontdekken, geen beveiligingsmaatregel. Iedereen die de regel kent, kan in seconden een Luhn-geldig nummer verzinnen. De echte bescherming tegen fraude zit bij de bank, in autorisatie, fraudedetectie en verificatie van de kaarthouder, niet in deze controlesom.

Waarom wordt het eerste cijfer van een Visa-nummer soms wel en soms niet verdubbeld? Dat hangt puur af van het totale aantal cijfers in het nummer. Bij een even aantal cijfers ligt het meest linkse cijfer op een even positie geteld vanaf rechts, en wordt het dus verdubbeld. Bij een oneven aantal cijfers, zoals de 15 cijfers van American Express, ligt datzelfde cijfer op een oneven positie en blijft het ongewijzigd.

Kan ik met dit soort testnummers echt iets kopen? Nee. Testnummers zoals 4111 1111 1111 1111 zijn expliciet gereserveerd voor sandboxomgevingen van betaalproviders en zijn nooit gekoppeld aan een echte rekening met saldo. Ze bestaan zodat ontwikkelaars een betaalflow kunnen bouwen en testen zonder een echte kaart te gebruiken, en ze worden door elke bank direct geweigerd bij een poging tot een echte transactie.

Waarom faalt mijn eigen kaartnummer soms de Luhn-check terwijl de kaart prima werkt aan de kassa? Dat wijst meestal op een tikfout bij het overtypen of een verkeerd gekopieerd cijfer, niet op een probleem met de kaart zelf. Controleer het nummer nogmaals tegen de fysieke kaart, cijfer voor cijfer. Blijft de check falen terwijl de kaart wel werkt, dan zit de fout vrijwel zeker in hoe het nummer is ingevoerd of overgenomen, niet in de kaart.

Creditcardnummer Validator
Probeer het nu zelf met de volledige tool.
Nu proberen