Aktualisiert am 2 Min. Lesezeit Von Namso Gen
BIN-Nummern verstehen: ein Leitfaden für Entwickler

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
Interaktiv

BIN-Aufbau erkunden

Fügen Sie eine Kartennummer ein, um zu sehen, was jeder Teil bedeutet.

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

  1. 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.
  2. 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.
  3. 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.

Verwandte Artikel