Irgendwann stoßen die meisten Entwicklerinnen und Entwickler im Zahlungsbereich auf dasselbe Problem: Für Tests werden IBAN-ähnliche Werte mit gültiger Prüfsumme benötigt, aber niemand möchte sie von Hand eintippen. Immer wieder dieselben Beispiele zu kopieren führt zu fragilen Testsuiten, und die Verwendung von Kundendaten schafft unnötige Datenschutz- und Betriebsrisiken. Sicherer ist es, synthetische Werte programmgesteuert zu erzeugen und von echten Zahlungssystemen getrennt zu halten.
Diese Anleitung zeigt dir genau, wie das in Python, JavaScript und PHP funktioniert. Am Ende hast du eine kleine Funktion mit wenigen Abhängigkeiten, die du in eine Factory, ein Seed-Skript oder ein Fixture-Modul einbauen kannst. Wenn du ohne eigenen Code nur schnell ein paar Werte brauchst, erzeugt der Random-IBAN-Generator sie sofort. Die Weboberfläche unterstützt 42 Länder, bis zu 100 Werte pro Stapel sowie den Export als CSV, JSON oder TXT.
Was „eine IBAN generieren“ tatsächlich bedeutet
Eine IBAN ist keine einzelne undurchsichtige Nummer, sondern besteht aus drei aneinandergehängten Teilen:
ES 76 21000418450200051332
│ │ └── BBAN (country-specific: bank + branch + account)
│ └───── Check digits (calculated, positions 3–4)
└──────── Country code (ISO 3166-1, positions 1–2)
Eine IBAN zu generieren bedeutet also, drei Dinge in dieser Reihenfolge zu erledigen:
- Ein Land auswählen und IBAN-Länge sowie BBAN-Aufbau nachschlagen.
- Einen zufälligen BBAN erstellen, der diesem Aufbau entspricht – mit der richtigen Anzahl an Ziffern und Buchstaben an den Stellen, an denen die Spezifikation sie erlaubt.
- Die beiden Prüfziffern mit dem MOD-97-Algorithmus berechnen, damit die gesamte Zeichenfolge die Prüfsumme besteht.
Für den ersten Schritt brauchst du eine kleine Nachschlagetabelle. Der zweite Schritt ist eine einfache Zufallserzeugung. Nur der dritte Schritt enthält echte Berechnungslogik – und es ist dieselbe Routine, die du auch zur Validierung einer IBAN verwenden würdest, nur in umgekehrter Richtung.
Der Kern: Prüfziffern berechnen
Alle folgenden Sprachen verwenden dieselbe Routine für die Prüfziffern. Die IBAN-Struktur ist in ISO 13616-1 definiert; die Prüfziffern verwenden das Verfahren ISO/IEC 7064 MOD97-10:
- Hänge an den BBAN den Ländercode und anschließend
00an. - Ersetze jeden Buchstaben durch zwei Ziffern (
A=10,B=11, …Z=35). - Lies das Ergebnis als eine große Ganzzahl und berechne
98 - (Ganzzahl mod 97). - Ergänze links Nullen, sodass das Ergebnis zwei Stellen hat.
Diese Zahl ist das Prüfziffernpaar. Setze es zwischen Ländercode und BBAN ein, dann besteht die fertige IBAN die MOD-97-Prüfung. Die Umsetzung sieht so aus.
Eine IBAN in Python generieren
Dank Pythons Ganzzahlen beliebiger Größe ist das fast trivial. Eine Big-Integer-Bibliothek ist nicht nötig.
import random
# Minimal layout table: country -> (total length, BBAN length)
IBAN_SPECS = {
"DE": 22, "ES": 24, "FR": 27, "GB": 22,
"NL": 18, "IT": 27, "PT": 25, "BE": 16,
}
def _check_digits(country: str, bban: str) -> str:
rearranged = bban + country + "00"
numeric = "".join(
str(ord(c) - 55) if c.isalpha() else c
for c in rearranged
)
check = 98 - (int(numeric) % 97)
return f"{check:02d}"
def generate_iban(country: str = "ES") -> str:
total_len = IBAN_SPECS[country]
bban_len = total_len - 4 # minus country code + check digits
bban = "".join(random.choices("0123456789", k=bban_len))
return country + _check_digits(country, bban) + bban
# Usage
print(generate_iban("DE")) # e.g. DE21 ... (valid checksum)
print([generate_iban("ES") for _ in range(5)])
Dieses bewusst minimale Beispiel bildet nur die Gesamtlänge und MOD-97 ab. Sein rein numerischer BBAN erfüllt nicht das nationale Zeichenmuster jedes aufgeführten Landes; für das Vereinigte Königreich, die Niederlande und Italien sind beispielsweise Buchstaben an bestimmten Stellen erforderlich. Eine zufällige Bankkennung ist außerdem nicht zwangsläufig vergeben oder aktuell. Behandle die Ausgabe als Prüfsummenübung. Für Format-Fixtures nach Land musst du das vollständige Muster aus dem SWIFT-Register und alle nationalen Prüfziffernregeln abbilden oder die RandomIBAN-Implementierung mit ihren dokumentierten Grenzen verwenden.
Eine IBAN in JavaScript generieren
Die einzige Besonderheit in JS: Die umgestellte Zahl ist zu groß für eine normale Number. Die übliche Lösung ist eine Schleife mit laufendem Rest, die den Wert immer unter 97 hält.
const IBAN_SPECS = {
DE: 22, ES: 24, FR: 27, GB: 22,
NL: 18, IT: 27, PT: 25, BE: 16,
};
function mod97(numericString) {
let remainder = 0;
for (const ch of numericString) {
remainder = (remainder * 10 + Number(ch)) % 97;
}
return remainder;
}
function checkDigits(country, bban) {
const rearranged = bban + country + '00';
const numeric = rearranged.replace(/[A-Z]/g, c =>
(c.charCodeAt(0) - 55).toString()
);
const check = 98 - mod97(numeric);
return String(check).padStart(2, '0');
}
function generateIban(country = 'ES') {
const bbanLen = IBAN_SPECS[country] - 4;
let bban = '';
for (let i = 0; i < bbanLen; i++) {
bban += Math.floor(Math.random() * 10);
}
return country + checkDigits(country, bban) + bban;
}
// Usage
console.log(generateIban('FR'));
console.log(Array.from({ length: 5 }, () => generateIban('NL')));
Wenn du kryptografisch stärkere Zufallswerte brauchst (für Testdaten selten nötig), ersetze Math.random() durch crypto.getRandomValues(). Für Fixtures und Demos reicht die einfache Variante völlig aus.
Eine IBAN in PHP generieren
Dieses PHP-Beispiel benötigt die optionale Erweiterung bcmath für die Berechnung des großen Modulo-Werts. Stelle sicher, dass sie in der Umgebung installiert und aktiviert ist, in der du den Code ausführst.
<?php
const IBAN_SPECS = [
'DE' => 22, 'ES' => 24, 'FR' => 27, 'GB' => 22,
'NL' => 18, 'IT' => 27, 'PT' => 25, 'BE' => 16,
];
function checkDigits(string $country, string $bban): string {
$rearranged = $bban . $country . '00';
$numeric = '';
foreach (str_split($rearranged) as $ch) {
$numeric .= ctype_alpha($ch) ? (string)(ord($ch) - 55) : $ch;
}
$check = 98 - (int) bcmod($numeric, '97');
return str_pad((string) $check, 2, '0', STR_PAD_LEFT);
}
function generateIban(string $country = 'ES'): string {
$bbanLen = IBAN_SPECS[$country] - 4;
$bban = '';
for ($i = 0; $i < $bbanLen; $i++) {
$bban .= random_int(0, 9);
}
return $country . checkDigits($country, $bban) . $bban;
}
// Usage
echo generateIban('IT'), PHP_EOL;
Beachte die Verwendung von random_int() statt rand(): Das ist hier die moderne und unverzerrte Variante und kostet nichts zusätzlich.
Generierte IBANs in einer Testsuite verwenden
Sobald du einen Generator hast, bindest du ihn am besten in deine Tests ein, statt Literale überall zu verteilen. Einige gut funktionierende Muster:
- Factories und Fixtures. Rufe
generateIban()in deiner Factory auf (FactoryBoy, Faker-Provider, Laravel Factory), damit jeder Testlauf neue Prüfsummen-Fixtures erhält. - Seed-Daten für Staging. Fülle Demo-Datenbanken mit einigen hundert IBANs aus mehreren Ländern, um länderspezifische Formatierung zu testen.
- Grenzfälle. Halte absichtlich fehlerhafte Zeichenfolgen (falsche Länge, falsche Prüfsumme, nicht unterstütztes Land) getrennt, um die Ablehnung durch deine Validierung zu testen.
- Determinismus, wenn nötig. Setze den Zufallszahlengenerator zu Beginn eines Tests mit einem Seed, wenn du reproduzierbare IBANs brauchst; lasse ihn für Fuzz-Tests ohne festen Seed laufen.
Was du auch erzeugst: Kennzeichne es eindeutig als synthetisch. Diese Werte können konfigurierte Struktur- und MOD-97-Prüfungen bestehen, aber RandomIBAN prüft nicht, ob ein erzeugter Wert einem vergebenen Konto entspricht. Sie dürfen niemals einen produktiven Zahlungsverkehr erreichen. Lies unseren Leitfaden zum sicheren Speichern von IBANs in Zahlungssystemen, damit sich Test- und Produktionsdaten nicht vermischen.
Wann du keinen eigenen Generator schreiben solltest
Einen eigenen Generator zu bauen ist für eine enge Integration sinnvoll, aber nicht immer den Aufwand wert. Verzichte auf eigenen Code, wenn:
- du jetzt schnell einen Batch brauchst: Der Random-IBAN-Generator erzeugt bis zu 100 Werte und unterstützt den Export als CSV, JSON oder TXT.
- du eine breite Länderabdeckung mit korrekten BBAN-Unterstrukturen brauchst (nationale Prüfziffern, Buchstabenpositionen), die eine minimale Tabelle nicht abbildet.
- du außerhalb einer Codebasis arbeitest – etwa an einer Tabelle, einer Postman-Sammlung oder einer Dokumentation.
Egal, welchen Weg du wählst: Validiere die Ausgabe. Prüfe ein Beispiel mit dem IBAN-Validator, um festzustellen, ob deine Prüfziffernlogik mit der Referenzimplementierung übereinstimmt. Wenn etwas MOD-97 nicht besteht, sind häufig eine falsche Buchstaben-zu-Ziffern-Umwandlung, das falsche Ländermuster oder eine falsche BBAN-Länge die Ursache.
FAQ
Kann ich programmatisch erzeugte IBANs sicher verwenden?
Für isolierte Formatvalidierung, QA, Demos und Dokumentation sind sie geeignet, wenn du sie klar als synthetisch kennzeichnest und von produktiven Zahlungswegen fernhältst. Eine bestandene Struktur- und Prüfsummenprüfung beweist nicht, dass ein Wert nicht vergeben ist. Sende erzeugte Werte daher niemals an eine echte Transaktion oder ein produktives Zahlungssystem.
Brauche ich eine externe Bibliothek, um eine IBAN zu generieren?
Die Python- und JavaScript-Beispiele benötigen kein externes Paket. Für das PHP-Beispiel muss die optionale Erweiterung bcmath installiert und aktiviert sein. Eine dedizierte Bibliothek oder zusätzliche Länderregeln können trotzdem sinnvoll sein, wenn du vollständige nationale BBAN-Muster statt nur Längen- und MOD-97-Prüfungen brauchst.
Warum schlägt meine generierte IBAN bei der Validierung fehl?
Häufige Ursachen sind eine falsche Zuordnung von Buchstaben zu Zahlen (sie muss von A=10 bis Z=35 reichen), das vergessene Anhängen des Ländercodes und von 00 vor dem Modulo-Schritt oder die falsche BBAN-Länge für das Land. Vergleiche einen einzelnen fehlerhaften Fall mit dem IBAN-Validator, um die Ursache einzugrenzen.
Wie generiere ich IBANs für Länder, deren BBAN Buchstaben enthält?
Erweitere den Schritt zur Erzeugung des zufälligen BBAN so, dass Buchstaben an den laut Länderspezifikation erlaubten Stellen eingesetzt werden – beim Vereinigten Königreich besteht die Bankkennung beispielsweise aus vier Buchstaben. Verwende pro Land ein Muster, das Buchstaben- und Ziffernpositionen festlegt, statt nur eine Gesamtlänge zu speichern. Fülle anschließend jede Position entsprechend aus und berechne die Prüfziffern.
Kann ich auf einmal Tausende von IBANs erzeugen?
Ja. Deine Generatorfunktionen lassen sich in einer Schleife kostengünstig aufrufen, sodass dein eigener Code Tausende Werte erzeugen kann. Wenn du lieber keinen Code ausführen möchtest, ist die Weboberfläche des Random-IBAN-Generators auf bis zu 100 Werte pro Batch begrenzt, unterstützt 42 Länder und bietet den Export als CSV, JSON und TXT mit einem Klick.
Was ist der Unterschied zwischen dem Generieren und dem Validieren einer IBAN?
Bei der Prüfsummenvalidierung wird ein vorhandener Wert geprüft, indem bestätigt wird, dass mod 97 == 1 gilt. Beim Generieren wird dieselbe Arithmetik umgekehrt ausgeführt: Zuerst erstellst du den BBAN und berechnest dann 98 - (mod 97), um die Prüfziffern zu finden, mit denen der Wert MOD-97 besteht. Beide Schritte verwenden denselben Kernalgorithmus; keiner beweist, dass das nationale BBAN vollständig ist oder ein Konto existiert.