Rijbewijsvalidator
Een van de uitdagendere projecten waaraan ik heb gewerkt. Voor een softwarebedrijf dat oplossingen ontwikkelt binnen de personenvervoerbranche heb ik een .NET MAUI-applicatie ontwikkeld die Nederlandse rijbewijzen via NFC uitleest en valideert volgens de ICAO 9303-standaard.
Project info
- Start
- augustus 2025
- End
- oktober 2025
- Complexity
- 9 / 10
- Team size
- 1
- Type
- Mobile app Verification tool
- Stack
- C# .NET MAUI GIT
Over het project
Voor een softwarebedrijf dat oplossingen ontwikkelt binnen de personenvervoerbranche heb ik gewerkt aan de implementatie voor het uitlezen en valideren van Nederlandse rijbewijzen via NFC.
De klant was vastgelopen in de implementatie en overwoog een externe, op Java gebaseerde package met tienduizenden euro’s aan jaarlijkse licentiekosten. Deze oplossing bleek niet alleen lastig te integreren binnen een .NET MAUI-applicatie, maar maakte naar mijn idee de code complexer en minder beheersbaar dan nodig. Nadat zij en meerdere van mijn ervaren collega’s er niet uitkwamen, kwam de vraag uiteindelijk bij mij terecht.
Al snel werd mij duidelijk dat de voorgestelde route op termijn ten koste zou gaan van onderhoudbaarheid en inzicht in de werking. In plaats van te blijven proberen een externe Java-oplossing passend te krijgen, besloot ik terug te gaan naar de kern: zorgen dat ik überhaupt een rijbewijs zonder foutcode kon uitlezen. Geen extra abstraherende lagen en geen afhankelijkheid van beperkte documentatie, maar focus op de basis: werkende, beveiligde communicatie met de chip.
De doorbraak
Het uitlezen van een Nederlands rijbewijs vereist communicatie met de NFC-chip volgens de ICAO 9303-standaard. Dit betekent het correct implementeren van BAC (Basic Access Control), het genereren van sessiesleutels op basis van de MRZ en het opzetten van beveiligde communicatie.
De grootste uitdaging zat in het verkrijgen van een geldige respons van de chip. Bij iedere poging kreeg ik slechts een algemene foutcode terug waar ik niets mee kon. Na een intensief weekend mij verdiept te hebben in de specificaties, het analyseren van de communicatie tussen app en chip en het stap voor stap testen van de beveiligde sessie, verscheen er op zondagavond,net voordat ik het wilde opgeven, voor het eerst een andere respons dan een foutmelding. Dat moment betekende dat de beveiligde communicatie werkte. Vanaf daar kon ik beginnen met de volgende fase: het ontsleutelen en valideren van de uitgelezen data.
Validatie volgens ICAO 9303 en RDW
Na het succesvol opzetten van de communicatie met de chip en het ontsleutelen van de data heb ik de volledige validatieketen geïmplementeerd conform ICAO 9303 en de aanvullende documentatie van de RDW.
Dit omvatte onder andere het volgende:
Controle van de officiële ondertekening van het document
Verificatie dat het rijbewijs digitaal is ondertekend door de bevoegde uitgevende instantie (RDW). De publieke sleutel van het document wordt gecontroleerd tegen de certificaatketen (CSCA), zodat vaststaat dat het document authentiek is en niet is gemanipuleerd.Controle dat de chip origineel is (anti-cloning)
Via een cryptografische challenge-response wordt gecontroleerd of de chip daadwerkelijk de private sleutel bezit die hoort bij de publieke sleutel in het document. Hiermee wordt uitgesloten dat de chip een kopie is.Integriteitscontrole van de gegevens
De hashwaarden van de uitgelezen datagroepen (zoals persoonsgegevens en aanvullende gegevens) worden vergeleken met de waarden die in het ondertekende beveiligingsdocument zijn vastgelegd. Zo wordt vastgesteld dat de gegevens niet zijn aangepast.
Resultaat
Het resultaat overtrof de verwachtingen van de klant. De uiteindelijke oplossing leest en valideert alle generaties Nederlandse rijbewijzen volledig volgens internationale standaarden, zonder afhankelijkheid van externe licentiepackages. Hierdoor worden aanzienlijke jaarlijkse kosten bespaard en heeft de klant volledige controle over het verificatieproces.
Terugblik
Dit project geeft een goed beeld van mijn doorzettingsvermogen en hoe ik te werk ga. Waar anderen stoppen omdat het niet lukt en daardoor kiezen voor een richting die de oplossing complexer en minder beheersbaar maakt dan nodig, neem ik bewust een stap terug en kijk ik opnieuw naar de kern van het probleem.
Het was zonder twijfel een van de meest uitdagende projecten waaraan ik heb gewerkt. Juist die combinatie van complexiteit, zelfstandige verdieping en het stap voor stap toewerken naar een werkende oplossing is wat mij energie en motivatie geeft in mijn werk.
Opmerking: Vanwege de aard van het systeem en de gevoeligheid van de onderliggende data ben ik beperkt in wat ik publiekelijk kan delen. Daarom bevat deze website geen schermafbeeldingen, codevoorbeelden of technische detailuitwerkingen over dit project.