Jede International Bank Account Number enthält zwei kleine Ziffern, die erstaunlich viel leisten. Sie stehen direkt hinter dem Ländercode, an den Positionen drei und vier, und bilden den eingebauten Fehlercheck der IBAN. Änderst du irgendwo in der IBAN eine Ziffer, passen diese Prüfziffern meistens nicht mehr. Ein Zahlungsformular kann den Wert dann vor dem Absenden ablehnen; die Prüfsumme entscheidet aber nicht darüber, ob eine Bank eine Zahlung verarbeitet.
In diesem Leitfaden erfährst du, wie die Prüfziffern berechnet werden, warum der Schritt Modulo 97 so wirksam ist und wie du sie in deinen eigenen Systemen zuverlässig berechnest oder prüfst.
Was die IBAN-Prüfsumme tatsächlich ist
Die beiden Ziffern hinter dem Ländercode heißen offiziell Prüfziffern. Sie sind weder zufällig noch Teil deiner Kontonummer, sondern werden aus dem restlichen IBAN-Wert abgeleitet. ISO 13616-1 definiert die IBAN-Struktur; für die Prüfziffern gilt das Verfahren ISO/IEC 7064 MOD97-10.
Es geht um die Datenintegrität. Wenn jemand eine IBAN in ein Zahlungsformular eintippt, passieren leicht Fehler: Aus einer 3 wird eine 8, zwei benachbarte Ziffern werden vertauscht oder ein Zeichen fehlt. Die Prüfziffern ermöglichen es einer Bank oder deinem eigenen Validierungscode, solche Fehler sofort zu erkennen, ohne die Empfängerbank zu kontaktieren.
Stell dir die Prüfziffern wie ein Paritätsbit für eine deutlich längere Zeichenfolge vor: ein kompakter Fingerabdruck der IBAN, der zusammen mit den geschützten Daten übertragen wird.
So funktioniert die Berechnung
Die Prüfroutine ist überraschend einfach. Nimm eine französische IBAN wie FR76 3000 6000 0112 3456 7890 189. So prüfst du sie:
- Verschiebe die ersten vier Zeichen ans Ende.
FR76wandert nach hinten; übrig bleibt30006000011234567890189FR76. - Ersetze jeden Buchstaben durch zwei Ziffern. Jeder Buchstabe wird einer Zahl zugeordnet:
A=10,B=11, …Z=35. Also giltF=15undR=27, wodurchFR76zu152776wird. - Lies das Ergebnis als eine große Ganzzahl und berechne
integer mod 97. - Ist der Rest genau 1, besteht der Wert die IBAN-Prüfung. Jeder andere Rest bedeutet, dass die Prüfsumme nicht passt. Ein Rest von 1 bestätigt weder den nationalen Bankcode noch die Kontozuweisung, den Kontoinhaber oder die Erreichbarkeit des Kontos.
Das ist der gesamte Algorithmus. Der entscheidende Punkt ist Schritt 4: Bei der Erstellung einer IBAN werden die Prüfziffern so gewählt, dass der Rest genau 1 ergibt.
Prüfziffern von Grund auf berechnen
Beim Erzeugen einer neuen IBAN läuft der Prozess umgekehrt:
- Baue die BBAN aus dem landesspezifischen Bankcode, der Filiale und der Kontonummer.
- Hänge den Ländercode und
00als Platzhalter für die Prüfziffern an. - Wandle Buchstaben in Zahlen um und berechne die große Ganzzahl.
- Berechne
98 - (integer mod 97). - Fülle das Ergebnis links mit Nullen auf zwei Stellen auf — das ist das Prüfziffernpaar.
Für die deutsche IBAN DE89 3704 0044 0532 0130 00 ergibt die Berechnung für die BBAN die Prüfziffern 89. Der Random-IBAN-Generator verwendet für jedes unterstützte Land das konfigurierte Zeichenmuster und berechnet die Prüfziffern so, dass der Wert MOD-97 besteht. Ausgewählte Bankcodelisten und nationale Prüfroutinen werden nur dort verwendet, wo sie implementiert sind; es wird nicht geprüft, ob ein Bankcode aktuell ist, ein Konto zugewiesen ist oder ein Provider-Sandbox-System den Wert akzeptiert.
Warum Modulo 97 und nicht etwas Einfacheres?
Man hätte auch eine einfache Prüfsumme wie „addiere alle Ziffern“ verwenden können. Die Wahl von 97 als Modul ist jedoch bewusst getroffen und hat praktische Vorteile:
- 97 ist eine Primzahl. Ein Primzahlmodul verteilt Fehler gleichmäßig und vermeidet manche blinden Flecken nicht-primer Verfahren.
- Jeder einzelne Ziffernfehler wird erkannt. Änderst du nur eine Ziffer, ändert sich der Rest.
- Die meisten Vertauschungen werden erkannt. Beim Vertauschen zweier benachbarter Zeichen schlägt die Prüfung in der überwältigenden Mehrheit der Fälle fehl.
- Unter einem einfachen Modell gleichmäßig zufälliger Fehler wird eine geschätzte Erkennungsrate von etwa 98,97 Prozent erreicht. Ein falscher Wert wird dabei mit Wahrscheinlichkeit 1/97 akzeptiert. Echte Tippfehlermuster können davon abweichen.
Der Nachteil: Du brauchst Ganzzahlarithmetik für sehr große Zahlen, weil eine 34-stellige IBAN zu einer Zahl mit vielen Stellen expandiert. In der Praxis ist das kein Problem — gängige Sprachen unterstützen das entweder direkt oder über eine kleine Bibliothek. Mit der unten gezeigten schrittweisen Berechnung kommst du sogar ohne große Ganzzahlen aus.
Prüfsumme im Code berechnen
Eine große Ganzzahl ist nicht zwingend nötig. Wegen der Rechenregeln für Modulo kannst du die Zeichen in kleinen Schritten verarbeiten und nur den laufenden Rest behalten.
JavaScript:
function isValidIban(iban) {
const s = iban.replace(/\s+/g, '').toUpperCase();
// Move first 4 chars to the end
const rearranged = s.slice(4) + s.slice(0, 4);
// Convert letters to numbers (A=10 ... Z=35)
const numeric = rearranged.replace(/[A-Z]/g, ch =>
(ch.charCodeAt(0) - 55).toString()
);
// Piece-wise mod 97 to avoid BigInt
let remainder = 0;
for (const digit of numeric) {
remainder = (remainder * 10 + Number(digit)) % 97;
}
return remainder === 1;
}
Python:
def is_valid_iban(iban: str) -> bool:
s = "".join(iban.split()).upper()
rearranged = s[4:] + s[:4]
numeric = "".join(
str(ord(c) - 55) if c.isalpha() else c
for c in rearranged
)
return int(numeric) % 97 == 1 # Python ints are arbitrary-precision
PHP:
function isValidIban(string $iban): bool {
$s = strtoupper(preg_replace('/\s+/', '', $iban));
$rearranged = substr($s, 4) . substr($s, 0, 4);
$numeric = '';
foreach (str_split($rearranged) as $ch) {
$numeric .= ctype_alpha($ch) ? (string)(ord($ch) - 55) : $ch;
}
// bcmod handles the large integer safely
return bcmod($numeric, '97') === '1';
}
Alle drei Beispiele folgen denselben vier Schritten. Der Unterschied liegt nur im Umgang mit der großen Zahl: Python verwendet beliebig große Ganzzahlen, PHP nutzt bcmod, und JavaScript arbeitet mit einem laufenden Rest. In einer vollständigen Anwendung musst du zusätzlich Format, Land, Länge und erlaubte Zeichen prüfen.
Früh prüfen, später erneut prüfen
Wenn du eine fehlerhafte IBAN zum richtigen Zeitpunkt erkennst, ersparst du dir und deinen Nutzern viel Ärger:
- Zuerst clientseitig prüfen. Führe den MOD-97-Check im Browser beim Tippen oder beim Verlassen des Feldes aus.
- Serverseitig erneut prüfen. Vertraue nie allein auf den Client; wiederhole die Prüfung im Backend.
- Vor der Prüfung normalisieren. Entferne Leerzeichen, wandle alles in Großbuchstaben um und lehne Zeichen außerhalb von
A–Zund0–9ab. - Format- und Prüfsummenfehler unterscheiden. „Diese IBAN ist für Deutschland zu kurz“ ist hilfreicher als „IBAN ungültig“.
Denke an die Grenze der Prüfsumme: Sie bestätigt nur die interne MOD-97-Konsistenz, nicht, dass das Konto existiert. Eine IBAN mit gültiger Prüfsumme kann zu einem geschlossenen oder nicht vorhandenen Konto gehören. Dafür brauchst du eine Kontoprüfung bei der Bank oder einen dafür vorgesehenen Dienst.
Synthetische IBAN-Testwerte erzeugen
Eine einzelne IBAN fest in deiner Testsuite zu hinterlegen ist unflexibel; eine echte IBAN zu verwenden kann ein Compliance-Risiko sein. Erzeuge stattdessen bei Bedarf synthetische IBANs mit gültiger Prüfsumme.
Mit Random IBAN erzeugte Werte nutzen das für IBAN-Prüfziffern spezifizierte Verfahren ISO/IEC 7064 MOD97-10 und die von ISO 13616-1 definierte Struktur. Sie bestehen daher diese Prüfsummenebene. Eine Bibliothek, die zusätzlich aktuelle Bankverzeichnisse, Provider-Regeln oder nicht unterstützte nationale Prüfungen kontrolliert, kann den Wert trotzdem ablehnen. Verwende die Werte für:
- Unit-Tests deiner Validierungsfunktionen mit synthetischen Prüfsummenfällen.
- QA von Sammelimporten mit bis zu 100 Werten und Export als CSV, JSON oder TXT im Webgenerator.
- Demos von Zahlungsformularen mit synthetischen Eingaben, die nicht in echte Zahlungswege gelangen.
Vergleiche deine Implementierung mit dem IBAN-Validator und prüfe deine Fixtures erneut, wenn ein Land sein IBAN-Format ändert. Hintergrundinformationen zum Standard findest du im Leitfaden Was ist eine IBAN?.
FAQ
Warum gibt es immer genau zwei Prüfziffern?
Der IBAN-Standard reserviert unabhängig von der Gesamtlänge für jedes Land zwei Prüfziffern. Damit lassen sich 100 Werte darstellen — genug für die Reste von 0 bis 96 — und das Format bleibt kompakt und einheitlich.
Kann eine falsche IBAN die MOD-97-Prüfung bestehen?
Ja, auch wenn das unwahrscheinlich ist. Unter einem einfachen Modell gleichmäßig zufälliger Fehler wird eine falsche Eingabe mit Wahrscheinlichkeit 1/97 akzeptiert; die geschätzte Erkennungsrate liegt dann bei etwa 98,97 Prozent. Echte Tippfehlermuster können abweichen, und ein kleiner Teil mehrstelliger Fehler kann zufällig wieder den Rest 1 ergeben. Die Prüfung garantiert die Struktur, nicht die Existenz oder Richtigkeit des Kontos.
Was ist der Unterschied zwischen IBAN-Prüfziffern und nationalen Prüfziffern?
Die beiden IBAN-Prüfziffern an Position 3–4 schützen die gesamte IBAN mit MOD-97. Einige Länder — etwa Spanien, Frankreich und Italien — enthalten zusätzlich eigene nationale Prüfziffern in der BBAN. Das sind getrennte Mechanismen auf unterschiedlichen Ebenen.
Brauche ich für die IBAN-Prüfung eine Bibliothek für große Ganzzahlen?
Nicht unbedingt. Die schrittweise Restberechnung aus dem Beispiel verarbeitet die Zahl in kleinen Schritten und hält den laufenden Wert unter 97. Große Ganzzahlen brauchst du nur, wenn du wie im Python-Beispiel int(numeric) % 97 direkt berechnest.
Warum wird ein Buchstabe mit A=10 statt A=1 umgewandelt?
Jeder Buchstabe wird zu einer zweistelligen Zahl zwischen 10 und 35. So bleibt die Stellenarithmetik konsistent. Mit A=1 würden ein- und zweistellige Werte gemischt und die Berechnung wäre nicht mehr korrekt.
Wie erzeuge ich IBANs mit gültigen Prüfziffern für Tests?
Nutze den Random-IBAN-Generator: Wähle ein Land, und der Generator füllt das konfigurierte BBAN-Muster aus und berechnet die Prüfziffern. Jeder Wert besteht MOD-97, aber Aktualität des Bankcodes, Kontozuweisung und Kompatibilität mit einer Provider-Sandbox werden nicht geprüft. Halte die generierten Werte von echten Zahlungssystemen getrennt, da eine zufällige Übereinstimmung möglich ist.