Ontcijfer de Belgische eID: MRZ & Chipgegevens Uitlezen met Python
Een complete gids met specificaties en codevoorbeelden voor het verwerken van de Belgische elektronische identiteitskaart.
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-readereneidreadervoor het direct uitlezen van de chip, enfastmrzofmrz-scanner-sdkvoor 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)
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.
(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.
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?
Heb ik speciale hardware nodig?
Welke Python-bibliotheek is het beste?
Zijn er wettelijke beperkingen aan het uitlezen van de eID?
Hoe worden controlecijfers (check digits) berekend?
Aanbevolen Verder Onderzoek
- Hoe implementeer ik check digit validatie voor ICAO MRZ in Python?
- Vergelijking van PC/SC smartcard lezers voor Belgische eID
- GDPR richtlijnen voor het verwerken van eID gegevens in België
- Python bibliotheken voor interactie met smartcards via PC/SC
Referenties
Last updated April 28, 2025