Eine IBAN gehört zu den wenigen Kennungen, deren innere Grammatik vollständig veröffentlicht ist. Von links gelesen passieren Sie drei Zonen: einen Ländercode, ein Paar Prüfziffern und danach den nationalen Kontoteil. Die ersten beiden Zonen sind überall gleich, während die dritte von einem Land zum nächsten ihre Form ändert.
Diese Mischung macht die Kennung zugleich leicht zu zerlegen und leicht falsch zu prüfen. Dieser Beitrag trennt die Bestandteile, erklärt die mod-97-Arithmetik, die sie zusammenhält, und zeigt, warum die Arithmetik das am wenigsten Interessante ist, was die Zeichenkette zu sagen hat.
Was sind die Bestandteile einer IBAN?
Der Name steht für internationale Bankkontonummer, und das Entwurfsziel war, dass eine einzige Zeichenkette genug Information trägt, um eine grenzüberschreitende Überweisung ohne separates Anweisungsblatt zu leiten.
| Position | Bestandteil | Wer ihn festlegt |
|---|---|---|
| Die ersten zwei Zeichen | Ländercode | Eine internationale Standardliste zweibuchstabiger Codes |
| Die nächsten zwei Zeichen | Prüfziffern | Die IBAN-Norm selbst, in jedem Land identisch |
| Alles danach | Nationaler Kontoteil, oft BBAN genannt | Die nationale Stelle des jeweiligen Landes |
Der Ländercode sagt, welche nationalen Regeln gelten; die zwei Ziffern sagen, ob die Zeichenkette die Übertragung unbeschadet überstanden hat; der Rest ist das Konto, so wie das Land selbst es schreibt. Nur die mittlere Zone ist durch die IBAN-Regeln vereinheitlicht, und nur die mittlere Zone lässt sich prüfen, ohne die Gliederung des Landes zu kennen.
Die Angaben in diesem Beitrag sind bewusst synthetische Platzhalter, gewählt, um das Zusammenspiel der Teile zu zeigen. Eine deutsche Kennung etwa besteht aus dem Ländercode DE, zwei Prüfziffern, acht Stellen für die Bankleitzahl und zehn Stellen für die Kontonummer. Keine solche Angabe steht für ein echtes Konto, und nichts hier ist als Behauptung zu lesen, dass ein bestimmtes Konto existiert.
Ländercode und die beiden ISO-Prüfziffern
Die zwei Ziffern nach dem Ländercode stammen aus einem international vereinbarten Prüfzeichensystem, der Anordnung MOD 97-10 aus der Familie, die der Beitrag über Prüfziffernverfahren bespricht. Weil die Arithmetik die ganze Zeichenkette in diese zwei Positionen faltet, macht jede Änderung an anderer Stelle sie ungültig.
Genau wegen dieser Eigenschaft lohnt sich die Berechnung des Paares auch dann, wenn die nationale Gliederung unbekannt ist. Eine Routine kann die ersten vier Zeichen gegen den Rest der Zeichenkette prüfen und daraus eine Aussage über die Unversehrtheit der Übertragung ableiten, ohne eine einzige nationale Spezifikation zu besitzen. Was sie nicht kann, ist zu entscheiden, ob die Länge zum genannten Land passt, denn diese Länge steht in den nationalen Regeln.
Innerhalb dieser nationalen Regeln unterscheiden sich die Felder stark. Ein Land kann eine Bankleitzahl und eine Kontonummer in eine feste Zahl von Positionen packen; ein anderes fügt eine Filiale, eine Währungskennung oder eine nationale Prüfziffer hinzu. Die IBAN-Norm hält fest, wie lang die gesamte Zeichenkette jedes Landes ist, doch die Bedeutung jedes inneren Feldes bleibt bei dem Land, das es definiert hat.
Warum trägt die BBAN oft eine eigene nationale Prüfziffer?
Weil der Kontoteil meist schon lange eine funktionierende nationale Nummer war, bevor er in ein grenzüberschreitendes Format eingebettet wurde. Die Banken hatten ihren eigenen Schutz gegen Übertragungsfehler längst gebaut, und die internationale Hülle hat ihn nicht entfernt. Das Ergebnis ist eine Zeichenkette mit zwei unabhängigen Prüfungen: dem internationalen Paar vorn und dem, was das Land innen eingebaut hat.
Die beiden werden aus verschiedenem Material berechnet und scheitern deshalb aus verschiedenen Gründen. Ein beschädigter Ländercode bricht das internationale Paar; eine vertippte Kontoziffer im nationalen Teil kann die nationale Prüfung, das internationale Paar oder beides brechen, je nachdem, wo sie sitzt. Wenn ein Prüfer meldet, das Format sei korrekt, aber die Prüfung scheitere, lautet die übliche Erklärung, dass der nationale Teil und seine Prüfung nicht mehr zusammenpassen.
Für eine Umsetzung heißt das: Dieselbe Zeichenkette kann auf einer Ebene richtig und auf einer anderen falsch sein, und eine Meldung, die beide zusammenwirft, genügt nicht. Sagen Sie, welche Prüfung gescheitert ist, und sagen Sie, welchen Teil der Zeichenkette sie abdeckt — die Lage des Problems ist die Information, die gebraucht wird.
Buchstaben in Zahlen verwandeln: die Idee hinter mod-97
Die Arithmetik braucht Ziffern, doch die Zeichenkette beginnt mit Buchstaben. Die Brücke ist eine Ersetzung: Jeder Buchstabe wird nach einer festen veröffentlichten Regel durch eine Zahl ersetzt, nachdem die ersten vier Zeichen ans Ende der Zeichenkette verschoben wurden. Der gesamte umgewandelte Wert wird dann durch siebenundneunzig geteilt, und gültig ist eine Kennung, die einen bestimmten Rest übrig lässt.
Das Umstellen statt des Anhängens ist der feine Punkt. Ländercode und Prüfziffern ans Ende zu schieben bedeutet, dass die zu prüfenden Ziffern am Ende der Zahl stehen, die geteilt wird, und den Rest damit unmittelbar beeinflussen. Erst dadurch können die beiden führenden Ziffern als Prüfung für alles danach wirken.
Zwei Folgen ergeben sich für alle, die Code schreiben. Erstens ist der umgewandelte Wert weit länger, als ein gewöhnlicher Ganzzahltyp fassen kann; die Division muss deshalb Ziffer für Ziffer oder mit einer Bibliothek für große Zahlen erfolgen. Versuche mit einer gewöhnlichen 64-Bit-Ganzzahl laufen still über und liefern bei manchen Eingaben Unsinn. Zweitens müssen Buchstaben mit der exakten veröffentlichten Zuordnung umgewandelt werden; Näherungen wie ein alphabetischer Rang ab eins ergeben einen Rest, der plausibel aussieht und schlicht falsch ist.
Warum belegt eine bestandene Prüfung kein bestehendes Konto?
Die mod-97-Arithmetik vergleicht die Zeichenkette mit sich selbst. Sie weiß nichts von einer Bank, einer Kundin oder einem Konto, und niemand bei einer ausgebenden Stelle wird befragt, wenn sie läuft. Ein Wert kann die Arithmetik einwandfrei erfüllen und trotzdem zu keinem Konto gehören, denn die Arithmetik zu erfüllen ist genau das, was jeder Generator absichtlich tut.
Zu prüfen, ob ein Konto offen und erreichbar ist, ist ein anderer Vorgang mit anderem Aufwand. Er verlangt einen Abgleich mit einem lebenden Verzeichnis, das begrenzt sein kann, außerhalb der Geschäftszeiten nicht verfügbar sein mag und für einen Aufruf womöglich eine vertragliche Beziehung voraussetzt. Das sind Fragen einer Grenze zwischen Client und Server und nicht Teil einer Prüfsummenroutine.
Die ehrliche Fehlermeldung beschreibt daher die Zeichenkette. Sie darf sagen, dass das Format passte und die Prüfziffern hielten, oder dass die Länge nicht zum angegebenen Ländercode passt. Sie darf nicht sagen, dass das Konto existiert, und sie darf nicht nahelegen, eine gescheiterte Prüfung bedeute, das Konto sei geschlossen oder betrügerisch.
Für Entwickler: Weiterleitung nach Land und Länge
Die Umsetzung ist überwiegend Buchhaltung, und in der Buchhaltung wohnen die Fehler.
- Normalisieren Sie zuerst die Eingabe: Leerzeichen und Bindestriche entfernen und die Schreibweise der Buchstaben vereinheitlichen.
- Lesen Sie den Ländercode und schlagen Sie ihn nach. Ist er unbekannt, melden Sie ein unbekanntes Schema statt einer gescheiterten Prüfung.
- Vergleichen Sie die Gesamtlänge mit der Länge, die das Land festlegt, und hören Sie dort auf, wenn sie nicht passt — die Arithmetik ist auf einer Zeichenkette falscher Größe nicht aussagekräftig.
- Führen Sie die mod-97-Umwandlung aus und vergleichen Sie den Rest, mit einer Ziffer-für-Ziffer-Routine oder einer Bibliothek für große Zahlen.
- Prüfen Sie jede nationale Prüfziffer im Kontoteil mit ihrer eigenen Regel.
Halten Sie die Ländertabelle als Daten, da sich Längen und Gliederungen ändern, und trennen Sie die beiden Urteile im Rückgabewert: Ein nicht unterstütztes Land ist kein ungültiges Konto. Wenn jemand einen Wert einfügt, der aus einer nicht vertrauenswürdigen Quelle stammt, denken Sie daran, dass Normalisierung Darstellung entfernt und sonst nichts; sie ist kein Reparaturschritt.
Nächste Schritte
Nehmen Sie ein Land, das Ihr Produkt unterstützt, notieren Sie, was seine nationale Gliederung enthält, und lesen Sie die Zeichenkette mit diesem Wissen noch einmal. Prüfen Sie dann einen Wert von Anfang bis Ende im Werkzeug zur Nummernprüfung und lesen Sie Nummern ohne Prüfziffer für den umgekehrten Fall, in dem ein Format das Äußerste ist, was ein Prüfer bestätigen kann.