Ein sicheres Testwerkzeug für Entwickler von Zahlungssystemen und QA-Fachleute. Alle Testnummern sind nicht funktionsfähig und ausschließlich für Entwicklungsumgebungen gedacht.

4 Min. Lesezeit Von Namso Gen

Der Luhn-Algorithmus erklärt: So funktioniert die Prüfung von Kartennummern

Jede Kartennummer, die Sie je in ein Formular eingegeben haben, wurde von einem 70 Jahre alten Algorithmus geprüft, bevor sie Ihren Browser verlassen hat. Der Luhn-Algorithmus — auch MOD 10 oder Modulus-10-Algorithmus genannt — ist die Prüfsumme, mit der alle großen Kartennetzwerke Tippfehler abfangen. Dieser Leitfaden erklärt, wie er funktioniert, wie Sie ihn umsetzen und was er nicht leisten kann.

Was ist der Luhn-Algorithmus?

Der Luhn-Algorithmus wurde 1954 vom IBM-Wissenschaftler Hans Peter Luhn erfunden und 1960 patentiert. Er ist eine einfache Prüfsummenformel, die versehentliche Fehler in Identifikationsnummern erkennt: einzelne Ziffernfehler, die meisten benachbarten Vertauschungen und einige weitere Fehlerklassen.

Er ist keine Sicherheitsmaßnahme und keine Verschlüsselung. Er ist eine Datenintegritätsprüfung. Kartennetzwerke hängen an jede Kartennummer eine Luhn-Prüfziffer an, und jedes System kann sie mit ein paar Zeilen Code und ohne Netzwerkzugriff verifizieren.

So funktioniert es, Schritt für Schritt

Gegeben sei eine Nummer, zum Beispiel 79927398713:

  1. Beginnen Sie bei der rechtesten Ziffer und arbeiten Sie nach links: Verdoppeln Sie jede zweite Ziffer.
  2. Ergibt das Verdoppeln einen Wert größer als 9, ziehen Sie 9 ab (das entspricht der Addition der beiden Ziffern des Ergebnisses).
  3. Summieren Sie alle Ziffern — sowohl die verdoppelten als auch die unveränderten.
  4. Ist die Summe durch 10 teilbar, besteht die Nummer die Prüfung.

Für 79927398713 ergibt die Summe der verarbeiteten Ziffern 70, die Nummer ist also gültig.

Bei einer echten Karte ist die Prüfziffer nicht im Voraus bekannt: Der Kartenaussteller berechnet sie so, dass die endgültige Nummer die Prüfung besteht. Deshalb erfüllt jede gültige Kartennummer der Welt dieselbe einzeilige Bedingung: total % 10 === 0.

Implementierung

JavaScript

function isValidLuhn(number) {
  const digits = number.replace(/\D/g, '');
  let sum = 0;
  let double = false;

  for (let i = digits.length - 1; i >= 0; i--) {
    let digit = Number(digits[i]);

    if (double) {
      digit *= 2;
      if (digit > 9) digit -= 9;
    }

    sum += digit;
    double = !double;
  }

  return sum % 10 === 0;
}

Python

def is_valid_luhn(number: str) -> bool:
    digits = [int(c) for c in number if c.isdigit()]
    total = 0

    for index, digit in enumerate(reversed(digits)):
        if index % 2 == 1:
            digit *= 2
            if digit > 9:
                digit -= 9
        total += digit

    return total % 10 == 0

PHP

function isValidLuhn(string $number): bool
{
    $digits = preg_replace('/\D/', '', $number);
    $sum = 0;
    $double = false;

    for ($i = strlen($digits) - 1; $i >= 0; $i--) {
        $digit = (int) $digits[$i];

        if ($double) {
            $digit *= 2;
            if ($digit > 9) {
                $digit -= 9;
            }
        }

        $sum += $digit;
        $double = !$double;
    }

    return $sum % 10 === 0;
}

Jede Nummer können Sie sofort mit unserem Luhn-Validator prüfen.

Was Luhn nicht erkennt

Der Luhn-Algorithmus ist bewusst einfach, was ihn auch leicht täuschbar macht:

  • Er kann nicht sagen, ob eine Karte existiert. Jede Nummer lässt sich Luhn-gültig machen, auch Nummern für BINs, die nie ausgegeben wurden. Luhn sagt nichts über das Konto, das Guthaben oder den Aussteller aus.
  • Er übersieht manche Vertauschungen. 09 und 90 zu tauschen ergibt dieselbe Summe, diese spezielle Vertauschung wird also nicht erkannt. Die meisten anderen benachbarten Vertauschungen werden erkannt.
  • Er validiert weder Länge noch BIN. Längenregeln und BIN-Bereiche sind separate Prüfungen. Eine 16-stellige Nummer kann Luhn bestehen und trotzdem für einen 15-stelligen Amex-BIN ungültig sein.
  • Er ist keine Sicherheitsfunktion. Angreifer generieren Luhn-gültige Nummern mühelos; die Prüfung soll Nutzer vor Tippfehlern schützen, nicht Systeme vor Betrug.

Warum Entwickler das interessiert

Wenn Sie irgendetwas bauen, das Kartendaten annimmt, begegnet Ihnen Luhn an mindestens drei Stellen:

  1. Clientseitige Validierung — geben Sie Nutzern sofortiges Feedback vor dem Absenden eines Formulars und vermeiden Sie einen Roundtrip zu Ihrem Zahlungsanbieter wegen eines offensichtlichen Tippfehlers.
  2. Generierung von Testdaten — Fixtures, Seeds und QA-Skripte brauchen Nummern, die die Validierung bestehen, was bedeutet, dass die Prüfziffer korrekt berechnet werden muss. Genau das macht unser Testkarten-Generator.
  3. Parsen und Normalisieren — wenn Nummern von Kunden, Tabellen oder Logs eintreffen, ist Luhn die günstigste erste Plausibilitätsprüfung, bevor Sie etwas an ein Gateway senden.

Gültige Testnummern generieren

Um aus einem beliebigen BIN strukturell gültige Testnummern zu generieren, verwenden Sie den Namso Gen Kartengenerator. Er berechnet die Luhn-Prüfziffer für Sie und kann Ablaufdaten und CVVs ergänzen. Wenn Sie jede Kombination eines Musters durchgehen möchten, akzeptiert der erweiterte Generator x-Wildcards.

Eine vollständige Erläuterung der Prüfungen, die über Luhn hinausgehen, finden Sie in BIN-Nummern erklärt oder prüfen Sie ein beliebiges Präfix mit dem BIN-Checker.

Zusammenfassung

  • Luhn (MOD 10) ist eine Prüfsumme, keine Gültigkeits- oder Sicherheitsprüfung.
  • Jede zweite Ziffer von rechts verdoppeln, summieren und die Teilbarkeit durch 10 prüfen — mehr gehört nicht dazu.
  • Alle großen Kartennetzwerke nutzen ihn, deshalb besteht jede echte Kartennummer die Prüfung.
  • Nutzen Sie ihn zur Tippfehlererkennung, niemals als einzige Validierung.

Verwandte Artikel