#klooienmetcomputers

BSN-nummers controleren?

Arnout van Kempen over rommelen in een digitale wereld.

Op GitHub heb ik een bestandje gezet, BSN.txt met daarin 999 regels, random gegenereerd door Excel. Iedere regel heeft hetzelfde formaat: een driecijferig regelnummer, een bsn-nummer van het formaat xxxx-xx-xxx en een code van vijf hoofdletters. Die drie velden zijn van elkaar gescheiden door spaties of tabs. De uitdaging voor de liefhebbers is: schoon dit bestand op, door alle regels eruit te halen waar een ongeldig bsn-nummer staat, en zet de resterende regels in een bestand BSN-clean.txt met alle goede regels, met de velden gescheiden door één spatie. Zet op het scherm alle regelnummers waar een ongeldig bsn-nummer in staat.

De oplossing staat op GitHub onder de naam 025-bsn.c

Wie het zelf wil proberen, inclusief het zoeken naar zaken die nog niet besproken zijn in deze rubriek moet nu stoppen met verder lezen. Succes!

Voor wie wel nog hulp wil bij de nieuwe onderwerpen:

De geldigheid van een bsn-nummer kan worden bepaald door ieder cijfer uit het nummer te vermenigvuldigen met de positie van het nummer, dat te sommeren, met als uitzondering het laatste cijfer dat niet met 1 maar met -1 moet worden vermenigvuldigd, en dat resultaat te delen door 11. Als het deelbaar is door 11, is het een geldig bsn-nummer.

Het openen van een bestand om te schrijven werkt hetzelfde als het openen om te lezen, alleen krijgt het nu als attribuut een 'w' mee, in plaats van een 'r', dus FILE * fopen(<bestand>,”w”);

Het lezen van een regel uit een bestand kan met fgets(<string>,<lengte string>,* FILE). Als dat een NULL oplevert is het einde van het bestand bereikt.

De functie char * strtok(<string>,” \t”) levert een string op naar het eerste veld in een string, tot een scheidingsteken, in dit geval spatie of tab. Door <string> te vervangen door NULL krijg je het volgende veld, en dat kan je herhalen.

Als char c = '5' dan is  int i=c-'0' het getal 5.

5/2==2 (want 5 en 2 zijn int). 5%2=1. % levert je dus de 'rest' van een deling van ints.

Schrijven naar een bestand werkt exact hetzelfde als printen naar het scherm, met een kleine aanpassing: je gebruikt fprintf(FILE *,…) in plaats van printf(…)

Succes!

Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op www.github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.

Arnout van Kempen di CCO CISA is directeur compliance & risk bij aaff, de fusieorganisatie van Alfa en ABAB. Hij schrijft op persoonlijke titel.

Gerelateerd

4 reacties

Ron Heinen

Data en informatie kun je puur wiskundig benaderen met de informatie-theorie. Op de link

https://drive.google.com/file/d/1pxSXu088bMx-XZctaZyxQpakeFMrbWaE/view

kun je een Nederlandstalig TuDelft collegedictaat vinden.

In hoofdstuk 4 kun je een inleiding vinden tot foutdetectie en foutcorrectie waar de controle van de BSN met de 11-proef onder valt, zie bijvoorbeeld 4.2.3 De ISBN codering.

Wil je wat verder duiken in de informatie-theorie dan is op

https://drive.google.com/file/d/1fHJilDnljs7Zf7EiyLIY3g6zkE8dzxbr/view

een goede inleiding te vinden.

Arnout van Kempen

Vanzelfsprekend. Maar aangezien het slechts random gegenereerde cijferreeksen zijn die getest kunnen worden op geldigheid als BSN-nummer, zoals duidelijk in de tekst staat, heeft de AVG hier geen enkele relevantie.

Ik ga uit van het idee dat wie deze serie volgt en mee doet (!) zelf kan bedenken dat analyses op echte BSN-nummers iets anders is dan deze programmeer-oefening.

Maar mocht iemand dat niet hebben bedacht: dank voor de waarschuwing

Frans Kersten

Het BSN is een bijzonder persoonsgegeven. Op grond van de Uitvoeringswet AVG mag je het BSN alleen verwerken als je daar een wettelijke grondslag voor hebt. De definitie van verwerking in de AVG is zodanig breed dat ook deze controle eronder valt. Dit is dus niet iets wat je vanuit compliance oogpunt zo maar even mag doen ...

Ron Heinen

Dank voor deze nieuwe #klooienmetcomputers

In het programma 025-bsn.c ontbreekt controle op de lengte van de string voordat deze met de funktie strcpy in een string met vaste lengte wordt gekopieerd.

Als deze string te groot is dan crasht dit programma als dit gecompileerd wordt met sommige gcc compilers.

Voorbeeld code met een check op de lengte van de string welke te groot is en het programma stopt kun je vinden op de link

https://www.ndax.eu/9nxkbj02O2cCjHSQuXaU.c

Reageren op een artikel kan tot drie maanden na plaatsing. Reageren op dit artikel is daarom niet meer mogelijk.

Aanmelden nieuwsbrief

Ontvang elke werkdag (maandag t/m vrijdag) de laatste nieuwsberichten, opinies en artikelen in uw mailbox.

Bent u NBA-lid? Dan kunt u zich ook aanmelden via uw ledenprofiel op MijnNBA.nl.