Chat
Ask me anything
Ithy Logo
Sign in to save

Ontcijfer de Belgische eID: MRZ & Chipgegevens Uitlezen met Python

Een complete gids met specificaties en codevoorbeelden voor het verwerken van de Belgische elektronische identiteitskaart.

read-belgian-eid-mrz-python-rkoro6od

Het uitlezen van gegevens van de Belgische elektronische identiteitskaart (eID) met Python is een specifieke taak die een goed begrip vereist van zowel de fysieke kaartkenmerken als de beschikbare softwaretools. In tegenstelling tot internationale paspoorten, die vaak een duidelijk zichtbare Machine Readable Zone (MRZ) hebben, bevat de Belgische eID primair een contactchip waarin de persoonlijke gegevens digitaal zijn opgeslagen. Deze gids biedt gedetailleerde specificaties en methoden om deze gegevens, inclusief MRZ-equivalente informatie, te extraheren met Python.

Belangrijkste Inzichten

  • Chip vs. Optische MRZ: De primaire methode voor het uitlezen van Belgische eID-gegevens is via de ingebouwde contactchip, waarvoor een smartcardlezer nodig is. Optische MRZ-scanning van een afbeelding is minder gebruikelijk voor eID's maar technisch mogelijk met bepaalde tools.
  • Python Bibliotheken: Er zijn specifieke Python-pakketten beschikbaar, zoals belgian-eID-python-reader en eidreader voor het direct uitlezen van de chip, en fastmrz of mrz-scanner-sdk voor het parsen van MRZ-gegevens (indien beschikbaar of geëxtraheerd uit de chip).
  • Standaarden en Validatie: De gegevensstructuur op de chip en eventuele visuele MRZ volgen de ICAO Doc 9303-standaard (meestal TD1-formaat). Cruciaal is het valideren van controlecijfers (check digits) om de nauwkeurigheid van de geëxtraheerde gegevens te garanderen.

De Belgische eID en de MRZ Standaard

Structuur en Specificaties

De Machine Readable Zone (MRZ) is een gestandaardiseerd formaat om identiteitsgegevens snel machineleesbaar te maken. Hoewel de Belgische eID voornamelijk vertrouwt op zijn contactchip, kunnen de gegevens die hieruit worden geëxtraheerd, of een eventuele visuele MRZ op oudere kaarten, worden gestructureerd volgens de ICAO Doc 9303-standaard. Voor identiteitskaarten is dit typisch het TD1-formaat.

Voorbeeld van een Belgische Identiteitskaart (eID)

Voorbeeld van een Belgische Identiteitskaart (eID)

TD1 MRZ Formaat (3 regels x 30 tekens)

De TD1 MRZ bestaat uit drie regels, elk met 30 tekens. De typische indeling voor een Belgische eID bevat de volgende velden:

  • Regel 1: Documenttype ('ID'), uitgevende staat ('BEL'), documentnummer, controlecijfer documentnummer, optionele data.
  • Regel 2: Geboortedatum (JJMMDD), controlecijfer geboortedatum, geslacht (M/V/X), vervaldatum (JJMMDD), controlecijfer vervaldatum, nationaliteit ('BEL'), optionele data.
  • Regel 3: Naam (Achternaam<<Voornaam/Voornamen), waarbij spaties worden vervangen door '<'.

Belgische Specificaties en Check Digits

De exacte implementatie en de gegevens op de chip worden bepaald door Belgische wetgeving en technische specificaties (zoals het Koninklijk besluit van 7 december 2006 en de Algemene Onderrichtingen eID). Een cruciaal onderdeel van de MRZ-standaard is het gebruik van controlecijfers (check digits). Deze cijfers worden berekend met een specifiek algoritme (gewogen som modulus 10) en dienen om de integriteit van de belangrijkste numerieke velden (zoals documentnummer, geboortedatum, vervaldatum) te verifiëren. Correcte validatie van deze check digits is essentieel bij het implementeren van een uitleesoplossing.

Gedetailleerde Structuur van de TD1 MRZ voor Belgische eID

De onderstaande tabel geeft een overzicht van de typische veldindeling binnen de TD1 MRZ, gebaseerd op de ICAO 9303-standaard zoals toegepast op identiteitskaarten.

Regel Positie(s) Lengte Beschrijving Voorbeeld (fictief)
1 1-2 2 Document Code (ID voor Identiteitskaart) ID
1 3-5 3 Uitgevende Staat (ISO 3166-1 alpha-3 code) BEL
1 6-14 9 Documentnummer 123456789
1 15 1 Controlecijfer (Check Digit) voor Documentnummer 0
1 16-30 15 Optionele data (vaak opgevuld met '<') <<<<<<<<<<<<<
2 1-6 6 Geboortedatum (JJMMDD) 800101
2 7 1 Controlecijfer (Check Digit) voor Geboortedatum 1
2 8 1 Geslacht (M, F, of X voor ongespecificeerd) M
2 9-14 6 Vervaldatum Document (JJMMDD) 280101
2 15 1 Controlecijfer (Check Digit) voor Vervaldatum 3
2 16-18 3 Nationaliteit (ISO 3166-1 alpha-3 code) BEL
2 19-29 11 Optionele data (vaak opgevuld met '<') <<<<<<<<<<<
2 30 1 Samengesteld Controlecijfer (Check Digit) voor posities 1-29 van regel 2 5
3 1-30 30 Naam (Achternaam<<Voornaam/Voornamen) JANSSENS<<JAN<MARIA<<<<<<<<<

Let op: De exacte posities en inhoud kunnen licht variëren afhankelijk van de specifieke kaartgeneratie en Belgische implementatie. Validatie met de check digits is daarom cruciaal.


Methoden voor het Uitlezen van eID Gegevens met Python

Er zijn hoofdzakelijk twee benaderingen om de gegevens van een Belgische eID te verkrijgen met Python:

Methode 1: Uitlezen van de Contactchip

Dit is de meest betrouwbare methode voor de Belgische eID, aangezien de kaart primair is ontworpen om via de chip te worden uitgelezen. Hiervoor is specifieke hardware (een smartcardlezer) en software nodig.

Benodigde Hardware en Software

  • Smartcardlezer: Een PC/SC compatibele smartcardlezer is vereist. Sommige leveranciers bieden specifieke readers aan die geoptimaliseerd zijn voor eID (bijv. Zetes, ACS, Feitian). Zorg ervoor dat de lezer compatibel is met de gebruikte eID-chip versie (v1.7, v1.8).
  • Middleware (Optioneel): Traditioneel was middleware van de overheid (eID Middleware) nodig. Sommige Python-bibliotheken kunnen echter direct met de kaart communiceren zonder deze middleware.

Python Bibliotheken voor Chip Communicatie

  • KuubixBV/belgian-eID-python-reader:

    Deze bibliotheek (beschikbaar op GitHub) streeft ernaar om rechtstreeks met de eID-chip te communiceren via de PC/SC interface, zonder de noodzaak van de officiële Belgische eID middleware. Dit kan de installatie en het beheer vereenvoudigen.

    # Conceptueel voorbeeld (installatie via pip git+)
    # pip install git+https://github.com/KuubixBV/belgian-eID-python-reader
    
    # from beidreader import BelgianEIDReader # Hypothetische import
    
    # try:
    #   reader = BelgianEIDReader()
    #   card_data = reader.read_identity_data() # Functie om identiteitsgegevens te lezen
    #   print(card_data)
    #   # card_data bevat typisch velden zoals naam, geboortedatum, documentnummer etc.
    # except Exception as e:
    #   print(f"Fout bij het lezen van de eID chip: {e}")
          

    Let op: Raadpleeg de documentatie van de repository voor de exacte installatie- en gebruiksinstructies.

  • eidreader (PyPI/lsaffre):

    Dit is zowel een command-line tool als een mogelijke bibliotheek (raadpleeg de documentatie) die interacteert met de eID-kaart, vaak via de systeemeigen PC/SC laag of de eID middleware. Het kan gegevens outputten in verschillende formaten, zoals JSON.

    import subprocess
    import json
    
    # Voorbeeld van het aanroepen van de command-line tool vanuit Python
    try:
        # Zorg ervoor dat 'eidreader' in je PATH staat of geef het volledige pad op
        result = subprocess.run(['eidreader', '--output', 'json', '--fields', 'all'], capture_output=True, text=True, check=True)
        eid_data = json.loads(result.stdout)
        print("Succesvol eID data gelezen:")
        print(f"  Documentnummer: {eid_data.get('card_number', 'Niet gevonden')}")
        print(f"  Naam: {eid_data.get('first_names', '')} {eid_data.get('surname', '')}")
        print(f"  Geboortedatum: {eid_data.get('date_of_birth', 'Niet gevonden')}")
        # Voeg hier meer velden toe zoals nodig
    except FileNotFoundError:
        print("Fout: 'eidreader' commando niet gevonden. Is het geïnstalleerd en in het PATH?")
    except subprocess.CalledProcessError as e:
        print(f"Fout bij het uitvoeren van eidreader: {e}")
        print(f"Stderr: {e.stderr}")
    except json.JSONDecodeError:
        print("Fout: Kon de JSON output van eidreader niet parsen.")
    except Exception as e:
        print(f"Een onverwachte fout trad op: {e}")
          

Methode 2: Optische MRZ Herkenning (OCR)

Hoewel minder gebruikelijk voor de moderne eID die primair op de chip leunt, kán het voorkomen dat u een afbeelding of scan van een (oudere) kaart met een zichtbare MRZ wilt verwerken, of de MRZ-gegevens wilt parsen nadat ze uit de chip zijn geëxtraheerd.

Uitdagingen bij OCR

Het optisch lezen van de MRZ is gevoelig voor:

  • Beeldkwaliteit: Resolutie, scherpte, contrast.
  • Belichting: Reflecties, schaduwen kunnen de OCR bemoeilijken.
  • Positie en Oriëntatie: De MRZ moet correct worden gedetecteerd in de afbeelding.

Python Bibliotheken voor OCR en MRZ Parsing

  • fastmrz:

    Een open-source bibliotheek specifiek ontworpen voor het snel detecteren en extraheren van MRZ-strings uit afbeeldingen.

    # Conceptueel voorbeeld (installatie via pip install fastmrz)
    # from fastmrz import MRZScanner
    #
    # scanner = MRZScanner()
    # image_path = 'pad/naar/eid_scan.jpg'
    #
    # try:
    #   mrz_lines = scanner.scan(image_path) # Kan een lijst van regels retourneren
    #   if mrz_lines:
    #      full_mrz = "\n".join(mrz_lines)
    #      print(f"Gedetecteerde MRZ:\n{full_mrz}")
    #      # Hierna volgt het parsen van de 'full_mrz' string
    #   else:
    #      print("Geen MRZ gevonden in de afbeelding.")
    # except Exception as e:
    #   print(f"Fout tijdens het scannen: {e}")
          
  • mrz-scanner-sdk:

    Een SDK (vaak gebaseerd op commerciële OCR-engines zoals Dynamsoft) die niet alleen de MRZ kan detecteren en lezen, maar ook direct kan parsen in gestructureerde velden en de check digits kan valideren.

    # Conceptueel voorbeeld (installatie via pip install mrz-scanner-sdk)
    # from mrz_scanner_sdk import MRZScanner # Hypothetische import/gebruik
    #
    # scanner = MRZScanner() # Mogelijk licentiesleutel nodig
    # mrz_string_from_ocr_or_chip = "IDBEL1234567890<<<<<<<<<<<<<<<\n8001011M2801013BEL<<<<<<<<<<<5\nJANSSENS<<JAN<MARIA<<<<<<<<<<<<<"
    #
    # try:
    #    parsed_data = scanner.parse_mrz(mrz_string_from_ocr_or_chip)
    #    print("Geparsede MRZ data:")
    #    print(f"  Document Type: {parsed_data.get('document_type')}")
    #    print(f"  Document Nummer: {parsed_data.get('document_number')}")
    #    print(f"  Geboortedatum: {parsed_data.get('date_of_birth')}")
    #    print(f"  Check Digits Valid: {parsed_data.get('all_check_digits_valid')}") # Belangrijk!
    # except Exception as e:
    #    print(f"Fout tijdens het parsen: {e}")
          
  • Algemene OCR (pytesseract + OpenCV):

    Men kan ook algemene OCR-tools gebruiken, maar dit vereist meer werk voor het specifiek lokaliseren van de MRZ-zone in de afbeelding en het opschonen van de OCR-resultaten voordat men kan parsen.


Vergelijking van Python Bibliotheken

Functionaliteiten en Geschiktheid

De keuze van de juiste Python-bibliotheek hangt af van uw specifieke behoeften: leest u de chip of een afbeelding? Heeft u ingebouwde validatie nodig? De onderstaande radar chart geeft een subjectieve vergelijking van de genoemde bibliotheken op basis van typische kenmerken.

Deze grafiek suggereert dat belgian-eID-python-reader sterk is in chipuitlezing met relatief weinig afhankelijkheden, terwijl mrz-scanner-sdk uitblinkt in optische herkenning en ingebouwde validatie, maar mogelijk complexer is. fastmrz is goed voor snelle optische detectie, en eidreader biedt een balans voor chipuitlezing via de command-line.


Visueel Overzicht: Het Uitleesproces

Van Kaart tot Gegevens

De onderstaande mindmap visualiseert de verschillende paden en componenten die betrokken zijn bij het uitlezen van gegevens van de Belgische eID met Python.

mindmap root["Belgische eID Uitlezen met Python"] id1["Gegevensbronnen"] id1_1["Contact Chip
(Primair)"] id1_2["Visuele MRZ
(Indien aanwezig/Scan)"] id2["Uitleesmethoden"] id2_1["Smartcard Lezer (PC/SC)"] id2_1_1["Hardware Vereist"] id2_2["Optische Scanner/Camera (OCR)"] id2_2_1["Beeldkwaliteit Cruciaal"] id2_2_2["Belichting/Reflecties"] id3["Python Implementatie"] id3_1["Bibliotheken Chip"] id3_1_1["belgian-eID-python-reader"] id3_1_2["eidreader (tool/lib)"] id3_1_3["pyscard (basis PC/SC)"] id3_2["Bibliotheken OCR/MRZ"] id3_2_1["fastmrz"] id3_2_2["mrz-scanner-sdk"] id3_2_3["pytesseract + OpenCV"] id4["Verwerking"] id4_1["Data Extractie"] id4_1_1["Naam, Geb. datum, Doc Nr, ..."] id4_2["Parsing (MRZ Structuur)"] id4_3["Validatie"] id4_3_1["Check Digit Controle!"] id5["Belangrijke Overwegingen"] id5_1["GDPR / Privacy Wetgeving"] id5_2["Foutafhandeling"] id5_3["Compatibiliteit (Chip/Lezer)"]

Deze mindmap toont hoe de gegevensbron (chip of visueel) bepaalt welke methode (kaartlezer of OCR) en welke Python-bibliotheken het meest geschikt zijn. De verwerking omvat altijd extractie, parsing en cruciale validatiestappen, met aandacht voor wettelijke en technische overwegingen.


Cruciale Overwegingen

Validatie, Privacy en Compatibiliteit

Check Digit Validatie

Het correct implementeren van de check digit validatie (volgens ICAO Doc 9303 specificaties) is essentieel om de nauwkeurigheid van de uitgelezen gegevens te waarborgen. Fouten in het documentnummer, de geboortedatum of vervaldatum kunnen hiermee worden gedetecteerd. Sommige bibliotheken (zoals mrz-scanner-sdk) bieden ingebouwde validatie.

Privacy en Wetgeving (GDPR)

De Belgische eID bevat gevoelige persoonsgegevens. Het uitlezen en verwerken hiervan valt onder de Algemene Verordening Gegevensbescherming (AVG/GDPR) en specifieke Belgische wetgeving.

  • Doelbinding: Verzamel en verwerk alleen gegevens die strikt noodzakelijk zijn voor het beoogde doel (bv. leeftijdsverificatie vereist alleen geboortedatum, geen volledig adres).
  • Transparantie: Informeer de kaarthouder over welke gegevens worden uitgelezen en waarom.
  • Beveiliging: Zorg voor adequate technische en organisatorische maatregelen om de gegevens te beschermen.
  • Toestemming: Afhankelijk van de context kan expliciete toestemming van de kaarthouder vereist zijn.
Raadpleeg de website van de Belgische Gegevensbeschermingsautoriteit (GBA) voor gedetailleerde richtlijnen.

Hardware- en Softwarecompatibiliteit

Zorg ervoor dat uw smartcardlezer compatibel is met zowel uw besturingssysteem als de specifieke versie van de Belgische eID-chip (v1.7, v1.8). Houd ook uw Python-bibliotheken en eventuele afhankelijkheden (zoals PC/SC drivers) up-to-date.

Vingerafdrukken

Sinds januari 2020 worden Belgische eID's uitgegeven met vingerafdrukken opgeslagen op de chip. Deze gegevens zijn echter sterk beveiligd en niet toegankelijk via de standaard uitleesmethoden die hier worden beschreven. Het uitlezen van de basisidentiteitsgegevens (naam, geboortedatum, etc.) wordt hierdoor niet beïnvloed.


Veelgestelde Vragen (FAQ)

Wat is het verschil tussen de chip lezen en de MRZ scannen?

De chip lezen gebeurt elektronisch via een smartcardlezer en geeft toegang tot de digitaal opgeslagen gegevens op de eID. Dit is de meest betrouwbare methode voor Belgische eID's. MRZ scannen gebeurt optisch (OCR) op een fysieke afdruk van de MRZ-code op het document (zoals bij paspoorten). Voor eID's is de chip de primaire bron; de MRZ is niet altijd prominent aanwezig of bedoeld voor primaire uitlezing.

Heb ik speciale hardware nodig?

Ja, voor het uitlezen van de contactchip van de Belgische eID heeft u een PC/SC compatibele smartcardlezer nodig. Deze zijn breed verkrijgbaar. Voor optische MRZ-scanning heeft u een scanner of camera nodig om een afbeelding van de kaart te maken.

Welke Python-bibliotheek is het beste?

Dat hangt af van uw doel:

  • Voor directe chipuitlezing zonder middleware: belgian-eID-python-reader (KuubixBV) is een goede optie.
  • Voor chipuitlezing via een command-line tool: eidreader (lsaffre) is handig.
  • Voor optische MRZ-detectie uit afbeeldingen: fastmrz is een snelle open-source keuze.
  • Voor optische MRZ-detectie, parsing én validatie: mrz-scanner-sdk (vaak commercieel) biedt een complete oplossing.
Bekijk de radar chart hierboven voor een visuele vergelijking.

Zijn er wettelijke beperkingen aan het uitlezen van de eID?

Ja, absoluut. Het uitlezen van persoonsgegevens van de eID valt onder de GDPR/AVG en Belgische privacywetgeving. U mag alleen gegevens uitlezen die noodzakelijk zijn voor een specifiek, legitiem doel en moet voldoen aan principes zoals transparantie, gegevensminimalisatie en beveiliging. Ongeoorloofd uitlezen of misbruik van gegevens is strafbaar. Raadpleeg de Belgische Gegevensbeschermingsautoriteit (GBA).

Hoe worden controlecijfers (check digits) berekend?

Check digits in de MRZ worden berekend volgens het algoritme beschreven in ICAO Doc 9303. Het is een gewogen som-modulus 10 berekening. Elk karakter in het te valideren veld (cijfers 0-9, letters A-Z, en '<') krijgt een numerieke waarde. Deze waarden worden vermenigvuldigd met een repeterende gewichtsfactor (meestal 7, 3, 1). De som van deze producten wordt gedeeld door 10, en de rest van deze deling is het controlecijfer. Bibliotheken zoals `mrz-scanner-sdk` kunnen deze validatie automatisch uitvoeren.


Aanbevolen Verder Onderzoek


Referenties

gegevensbeschermingsautoriteit.be
eID uitlezen - Gegevensbeschermingsautoriteit

Last updated April 28, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI
Download Article
Delete Article