BIN-Nummern verstehen: ein Leitfaden für Entwickler
Was ist eine BIN/IIN-Nummer?
Eine Bank Identification Number (BIN), offiziell Issuer Identification Number (IIN), sind die ersten 6 oder 8 Ziffern einer Zahlungskartennummer. Sie identifiziert das Kartennetzwerk und das Institut, das die Karte ausgegeben hat. Zahlungssysteme nutzen sie, um Transaktionen weiterzuleiten, Betrugsregeln anzuwenden und zu entscheiden, welche Validierungsregeln gelten.
Die IIN war früher 6-stellig. Seit der Überarbeitung von ISO/IEC 7812-1 im Jahr 2017 sind neue IINs 8-stellig, und Visa und Mastercard vergeben seit April 2022 8-stellige BINs. Ältere 6-stellige BINs sind weiterhin im Umlauf, Ihr Code muss also beide verarbeiten können.
Aufbau einer BIN-Nummer
Aufschlüsselung des Standardformats
| Position | Länge | Zweck | Beispiel |
|---|---|---|---|
| 1 | 1 Ziffer | Major Industry Identifier (MII) | 4 (Bank- und Finanzwesen) |
| 1–6 oder 1–8 | 6 oder 8 Ziffern | Issuer Identification Number (BIN/IIN), einschließlich MII | 453201 oder 45320151 |
| Nach der BIN bis zur vorletzten Ziffer | Variabel | Individuelle Kontokennung | 5112830 |
| Letzte | 1 Ziffer | Luhn-Prüfziffer | 6 |
Werte des Major Industry Identifier (MII)
Dies sind die Kategorien nach ISO/IEC 7812-1 für die erste Ziffer:
| MII-Ziffer | Branche |
|---|---|
| 0 | ISO/TC 68 und andere Branchenzuweisungen |
| 1 | Fluggesellschaften |
| 2 | Fluggesellschaften, Finanzwesen und andere künftige Branchenzuweisungen |
| 3 | Reisen und Unterhaltung |
| 4 | Bank- und Finanzwesen |
| 5 | Bank- und Finanzwesen |
| 6 | Handel sowie Bank- und Finanzwesen |
| 7 | Mineralöl und andere künftige Branchenzuweisungen |
| 8 | Gesundheitswesen, Telekommunikation und andere künftige Branchenzuweisungen |
| 9 | Zur Zuweisung durch nationale Normungsorganisationen |
Häufige BIN-Bereiche nach Kartennetzwerk
Primäre BIN-Bereiche
Dies sind die wichtigsten veröffentlichten Bereiche. Jedes Netzwerk hat zusätzlich kleinere Bereiche; verstehen Sie dies daher als Hilfe zur Einordnung, nicht als vollständiges Register.
bin_ranges = {
'Visa': ['4'],
'Mastercard': ['51-55', '2221-2720'],
'American Express': ['34', '37'],
'Discover': ['6011', '644-649', '65'],
'JCB': ['3528-3589'],
'Diners Club': ['300-305', '3095', '36', '38-39'],
'UnionPay': ['62', '8100-8171'],
}
Das Discover-Netzwerk akzeptiert in den USA auch UnionPay-Karten (einschließlich des Bereichs 622126–622925) und Diners-Club-Karten, diese Karten gehören aber weiterhin zu ihren eigenen Netzwerken.
Implementierung einer BIN-Abfrage
import re
NETWORK_LENGTHS = {
'Visa': {13, 16, 19},
'Mastercard': {16},
'American Express': {15},
'Discover': {16, 17, 18, 19},
'JCB': {16, 17, 18, 19},
'Diners Club': {14, 15, 16, 17, 18, 19},
'UnionPay': {16, 17, 18, 19},
}
def detect_network(number: str) -> str:
first2, first4 = int(number[:2]), int(number[:4])
if number.startswith(('34', '37')):
return 'American Express'
if number.startswith(('300', '301', '302', '303', '304', '305', '3095', '36', '38', '39')):
return 'Diners Club'
if 3528 <= first4 <= 3589:
return 'JCB'
if number.startswith(('6011', '65')) or 644 <= int(number[:3]) <= 649:
return 'Discover'
if number.startswith('62') or 8100 <= first4 <= 8171:
return 'UnionPay'
if 51 <= first2 <= 55 or 2221 <= first4 <= 2720:
return 'Mastercard'
if number.startswith('4'):
return 'Visa'
return 'Unknown'
def validate_bin(card_number: str) -> dict:
number = re.sub(r'\D', '', card_number)
if len(number) < 6:
return {'valid': False, 'error': 'Enter at least 6 digits'}
network = detect_network(number)
return {
'bin': number[:8] if len(number) >= 16 else number[:6],
'network': network,
'length': len(number),
'valid_length': len(number) in NETWORK_LENGTHS.get(network, set(range(12, 20))),
}
Ob die BIN 6 oder 8 Ziffern hat, hängt vom Kartenaussteller ab; das Snippet behält daher bei Nummern in voller Länge die ersten 8 Ziffern. Abfragedienste akzeptieren beides.
Eigenschaften von BIN-Daten
Typische Felder einer BIN-Abfrage
Es gibt kein Standardschema: Dies sind die Felder, die die meisten kommerziellen und offenen BIN-Abfragedienste zurückgeben, und die Namen unterscheiden sich je nach Anbieter.
| Feld | Beschreibung | Beispiel |
|---|---|---|
| scheme | Kartennetzwerk | "visa" |
| country | Ausgabeland | "US" |
| type | Kartentyp | "credit" |
| category | Kartenstufe oder Produkt | "platinum" |
| issuer | Ausgebende Bank | "CHASE" |
| length | Länge der Kartennummer | 16 |
BIN-basierte Validierungsregeln
Länge der Kartennummer nach Netzwerk
| Netzwerk | Gültige Längen |
|---|---|
| Visa | 13, 16, 19 |
| Mastercard | 16 |
| American Express | 15 |
| Discover | 16–19 |
| JCB | 16–19 |
| Diners Club | 14–19 (36), 16–19 (übrige Bereiche) |
| UnionPay | 16–19 |
Integrationsbeispiel
const NETWORK_LENGTHS = {
visa: [13, 16, 19],
mastercard: [16],
amex: [15],
discover: [16, 17, 18, 19],
jcb: [16, 17, 18, 19],
diners: [14, 15, 16, 17, 18, 19],
unionpay: [16, 17, 18, 19],
};
const binValidator = {
checkBIN(cardNumber) {
const digits = cardNumber.replace(/\D/g, '');
if (digits.length < 6) {
return { valid: false, error: 'Enter at least 6 digits' };
}
const network = this.detectNetwork(digits);
const lengths = NETWORK_LENGTHS[network] || [];
return {
valid: lengths.includes(digits.length),
network,
bin: digits.slice(0, digits.length >= 16 ? 8 : 6),
cardLength: digits.length,
};
},
detectNetwork(digits) {
const first4 = Number(digits.slice(0, 4));
if (/^3[47]/.test(digits)) return 'amex';
if (/^(30[0-5]|3095|36|3[89])/.test(digits)) return 'diners';
if (first4 >= 3528 && first4 <= 3589) return 'jcb';
if (/^(6011|64[4-9]|65)/.test(digits)) return 'discover';
if (/^62/.test(digits) || (first4 >= 8100 && first4 <= 8171)) return 'unionpay';
if (/^5[1-5]/.test(digits) || (first4 >= 2221 && first4 <= 2720)) return 'mastercard';
if (/^4/.test(digits)) return 'visa';
return 'unknown';
},
};
Sicherheitsaspekte
-
Datenschutz
- Eine BIN allein zählt nicht zu den Karteninhaberdaten, eine vollständige Kartennummer (PAN) dagegen schon. Vermeiden Sie es, vollständige PANs zu speichern; wenn es unumgänglich ist, verlangt PCI DSS Anforderung 3, dass sie unlesbar gemacht werden (starke Kryptografie, Kürzung, Tokenisierung oder Keyed Hashing).
- Wenn Sie eine gekürzte Nummer aufbewahren, halten Sie die Kürzungsgrenzen des PCI SSC ein: höchstens die ersten 8 und beliebige weitere 4 Ziffern bei 16-stelligen PANs sowie die ersten 6 und letzten 4 Ziffern bei 15-stelligen Amex-Nummern.
- Verschlüsseln Sie vollständige Kartennummern bei der Übertragung (TLS) und beschränken Sie, wer darauf zugreifen darf.
-
Compliance
- Wer vollständige PANs speichert oder verarbeitet, bringt seine Systeme in den Geltungsbereich von PCI DSS; Tokenisierung über Ihren Zahlungsanbieter hält den Großteil davon heraus.
- Legen Sie Aufbewahrungsfristen für alles fest, was aus Kartendaten abgeleitet ist, einschließlich Logs.
-
Performance
- Cachen Sie Ergebnisse von BIN-Abfragen; BIN-Daten ändern sich nur langsam.
- Beachten Sie die Rate-Limits Ihres Abfrageanbieters und nutzen Sie Bulk-Endpunkte, wo verfügbar.
Best Practices für die BIN-Verarbeitung
| Praxis | Zweck | Umsetzung |
|---|---|---|
| Caching | API-Aufrufe reduzieren | BIN-Daten im Speicher oder in einer lokalen Tabelle vorhalten |
| Validierung | Fehler vermeiden | Format, Länge und Luhn vor einem API-Aufruf prüfen |
| Monitoring | Probleme erkennen | Fehlgeschlagene Abfragen und unbekannte BINs loggen |
| Unterstützung 8-stelliger BINs | Genauigkeit sichern | Zuerst auf 8 Ziffern abgleichen, dann auf 6 zurückfallen |
BIN-Daten sind eine Hilfe zur Einordnung, kein Nachweis, dass eine Karte existiert oder genehmigt wird. Kombinieren Sie sie mit der Luhn-Prüfung, Längenregeln und, bei echten Zahlungen, dem Autorisierungsergebnis Ihres Gateways.