Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 30-09 11:34
Lang verhaal kort, ik heb voor de Uitnodiging slimme digitale oplossingen Corona van het Ministerie van Volksgezondheid, Welzijn en Sport een inzending gedaan voor de doelstelling "Het verkrijgen van voorstellen voor overige digitale oplossingen, zoals bijvoorbeeld apps, die kunnen bijdragen aan de transitiestrategie en het bestrijdingsbeleid". Oplossingen voor deze doelstelling zijn nog niet in behandeling genomen omdat de eerste aandacht uit gaat naar oplossingen die een bijdrage kunnen leveren aan de bron- en contactopsporing.

Dat gezegd hebbende, mijn inzending gaat over een methode om digitaal een verplaatsbewijs uit te kunnen geven. Los van of ik of iemand dit wil denk ik dat het goed is realistisch te zijn en te bedenken dat er al veel plekken op de wereld zijn waar dit in niet-digitale vorm wordt toegepast. Zo zijn er plekken in onder andere Italië en Spanje waar men niet de straat op mag zonder een door de overheid ondertekende verklaring.

Vooral het laatste stuk is iets waarvan je af kunt vragen of je het wilt. Doordat mensen in deze gebieden de overheid een verklaring op moeten laten stellen, moeten zij ook gegevens zoals de woonadressen van hun persoonlijke contacten overhandigen. Mijn methode zorgt er voor dat deze gegevens niet naar de overheid hoeven te gaan, maar dat tegelijkertijd de overheid wel zekerheid heeft dat mensen alleen met een geldige verklaring over straat gaan.

In drie uur tijd heb ik mijn oplossing uitgewerkt tot iets wat enkel nog aan een database gekoppeld hoeft te worden om te functioneren. De broncode hiervoor heb ik op Github gepubliceerd en een kopie hiervan gehost op https://www.verplaatsbewijs.nl/.

Voorbeeldlink van een "geldig" verplaatsbewijs:
* https://www.verplaatsbewi...3/4000AA444A/5000AA555BIS
Voorbeeldlink met een aangepast verplaatsbewijs:
* https://www.verplaatsbewi...2/9999ZZ3/9999ZZ4/9999ZZ5

Graag zou ik mede-Tweakers die interesse hebben willen vragen om een audit uit te voeren op deze code en alle mogelijke aanvalsvectoren of bezorgdheden over privacy te delen.
Let wel op dat de oplossing an sich in dit topic niet ter discussie hoeft te staan. Ik heb -net als veel anderen- denk ik liever een situatie waar ik bij controle een bewijs moet laten zien waarom ik mij op straat begeef, dan eentje waarbij op elke straathoek een soldaat staat die je direct weer naar binnen toe jaagt. Mijn enige doel is een oplossing te bieden waarbij de gegevens op dit "Verplaatsbewijs" niet in te zien zijn door de overheid.

Acties:
  • 0 Henk 'm!

  • O88088
  • Registratie: Februari 2011
  • Laatst online: 20:14
Zo zijn er plekken in onder andere Italië en Spanje waar men niet de straat op mag zonder een door de overheid ondertekende verklaring.

Vooral het laatste stuk is iets waarvan je af kunt vragen of je het wilt. Doordat mensen in deze gebieden de overheid een verklaring op moeten laten stellen, moeten zij ook gegevens zoals de woonadressen van hun persoonlijke contacten overhandigen.
Waarom zouden we een commercieel bedrijf wel vertrouwen met deze gegevens?

Acties:
  • +4 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Ik heb even naar je code zitten kijken.
Oef... waar te beginnen?

In je javascript:
- Gebruik "use strict"
- In secure code mag je eigenlijk nooit regexes gebruiken
- De regexes zijn niet beperkend genoeg (bv [a-zA-Z0-9] waar alleen [0-9a-f] voldoet)
- Waarom voer je dezelfde regex match (regex_hash) 4x uit?
- Gebruik nooit document.location maar altijd window.location
- Gebruik ES6 `let` ipv `var` voor block-level scoping ipv function-level scoping
- Je herhaalt veel te vaak `verplaatsbewijs.data`, dit duidt op een designfout
- Gebruik geen `Math.random` maar `crypto.getRandomValues`

[ Voor 3% gewijzigd door Juup op 19-04-2020 14:52 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • Marzman
  • Registratie: December 2001
  • Niet online

Marzman

They'll never get caught.

Griekenland doet dit via een website. Je moet dan het bewijs printen of een sms laten sturen als bewijs.

☻/ Please consider the environment before printing this signature
/▌
/ \ <-- This is bob. copy and paste him and he will soon take over the world.


Acties:
  • 0 Henk 'm!

  • Puch-Maxi
  • Registratie: December 2003
  • Laatst online: 30-09 23:54
@Marzman Heb je hier nog wat meer informatie over? Ik gebruik de verkeerde zoektermen denk ik :).

My favorite programming language is solder.


Acties:
  • +1 Henk 'm!

  • Marzman
  • Registratie: December 2001
  • Niet online

Marzman

They'll never get caught.

Puch-Maxi schreef op zondag 19 april 2020 @ 14:58:
@Marzman Heb je hier nog wat meer informatie over? Ik gebruik de verkeerde zoektermen denk ik :).
https://forma.gov.gr/en/

☻/ Please consider the environment before printing this signature
/▌
/ \ <-- This is bob. copy and paste him and he will soon take over the world.


Acties:
  • +1 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 30-09 11:34
Juup schreef op zondag 19 april 2020 @ 14:51:
Ik heb even naar je code zitten kijken.
Oef... waar te beginnen?

In je javascript:
- Gebruik "use strict"
- In secure code mag je eigenlijk nooit regexes gebruiken
- De regexes zijn niet beperkend genoeg (bv [a-zA-Z0-9] waar alleen [0-9a-f] voldoet)
- Waarom voer je dezelfde regex match (regex_hash) 4x uit?
- Gebruik nooit document.location maar altijd window.location
- Gebruik ES6 `let` ipv `var` voor block-level scoping ipv function-level scoping
- Je herhaalt veel te vaak `verplaatsbewijs.data`, dit duidt op een designfout
- Gebruik geen `Math.random` maar `crypto.getRandomValues`
Heel veel dank. Ik heb geprobeerd expres geen ES6 te gebruiken omdat niet alle browsers (IE) dit ondersteunen.

Ik voer regex_hash meerdere keren uit voor de leesbaarheid. Ik weet dat ik het resultaat de eerste keer op kan slaan en hergebruiken, maar dit "scheelt" weer een verbinding die je in je hoofd moet maken.

Herhalen van 'verplaatsbewijs.data' ben ik me van bewust, maar dit is functioneel en als ik de code nog had hergestructureerd was het me niet binnen vier uur gelukt dit uit te werken en documenteren. Maar ik neem het mee voor een volgende update!

Crypto is volgens mij ook geen onderdeel van ES5, maar als dat wel zo is ga ik het zeker gebruiken. Het is nu een pseudo-oplossing die inderdaad nog vervangen moet worden.

Je andere tips ga ik ook verwerken!

Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 30-09 11:34
O88088 schreef op zondag 19 april 2020 @ 14:37:
[...]


Waarom zouden we een commercieel bedrijf wel vertrouwen met deze gegevens?
Je vertrouwt niemand met de gegevens, alleen jij hebt er toegang tot.
Marzman schreef op zondag 19 april 2020 @ 14:52:
[...]

Griekenland doet dit via een website. Je moet dan het bewijs printen of een sms laten sturen als bewijs.
Dit is dus exact wat mijn voorbeeld probeert te voorkomen.

Acties:
  • +1 Henk 'm!

  • Azer
  • Registratie: Oktober 2003
  • Niet online
Skit3000 schreef op zondag 19 april 2020 @ 15:56:
[...]


Heel veel dank. Ik heb geprobeerd expres geen ES6 te gebruiken omdat niet alle browsers (IE) dit ondersteunen.
Hier worden vaak transpilers voor gebruikt zoals Babel. Die zorgen ervoor dat je ES6 functionaliteiten kan gebruiken terwijl je nog wel backwards compatible bent met oudere browsers.

Acties:
  • 0 Henk 'm!

  • Azer
  • Registratie: Oktober 2003
  • Niet online
Wat ik trouwens niet snap is dat de postcodes die ik heb opgegeven te gaan bezoeken in de QR code staan. Als ik bijvoorbeeld een verplaatsbewijs aanmaak met default waardes, wordt de volgende URL gegenereerd:
https://www.verplaatsbewi...3/4000AA444A/5000AA555BIS

In het laatste stuk van de URL: JANJANSEN/1000AA1/2000AA22/3000AA333/4000AA444A/5000AA555BIS staan allemaal persoonsgegevens.

Hierbij is dus mijn naam zichtbaar en de postcodes die ik ga bezoeken. Is dat de bedoeling of begrijp ik de oplossing niet goed? Overigens zou ik er nooit voor kiezen om persoonsgegevens zoals namen en postcodes via query string parameters te versturen. Dit betekend namelijk dat deze gegevens zichtbaar zijn voor iedereen, zelfs als je ze naar een server stuurt met SSL encryptie. Aangezien het hier om persoonsgegevens gaat, is dit niet te adviseren.

Als laatste opmerking zou ik nog willen meegeven dat het slim is om code altijd in het engels te schrijven. Op die manier kunnen alle ontwikkelaars het lezen in plaats van alleen ontwikkelaars die de nederlandse taal machtig zijn.

[ Voor 5% gewijzigd door Azer op 24-04-2020 14:11 ]


Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 30-09 11:34
Dank je Azer, ik ga kijken naar Babel!

Met betrekking tot de naam en postcode in de URL; deze zijn onderdeel van de hash en worden hierdoor niet aan de server verzonden. Het is wel uit te lezen met javascript en dat draait dan weer alleen in de browser van degene die de QR-code scant en die persoon heeft deze gegevens hoe dan ook nodig.

Ik had extra veel moeite gedaan om deze code in het Nederlands te schrijven om het ook iets inzichtelijker te maken voor mensen die niet 100% thuis zijn in programmeertalen maar toch op een logische manier willen kunnen nagaan wat er allemaal gebeurd.

Acties:
  • 0 Henk 'm!

  • SambalBij
  • Registratie: September 2000
  • Laatst online: 30-09 19:29

SambalBij

We're all MAD here

Skit3000 schreef op vrijdag 24 april 2020 @ 14:19:
Met betrekking tot de naam en postcode in de URL; deze zijn onderdeel van de hash en worden hierdoor niet aan de server verzonden. Het is wel uit te lezen met javascript en dat draait dan weer alleen in de browser van degene die de QR-code scant en die persoon heeft deze gegevens hoe dan ook nodig.
Nee?
Als ik je voorbeeld bekijk en die QR code scan, gaat die naar een URL 'https://www.verplaatsbewijs.nl/ABCDEFGHJKMNPQRS/ca2f80b652a7fe8dcf76ab5792872f039fa91d99b30b2ef20aba54c7458f2388/#7630a5476f214b5ec72b4c92c6f7c7d5ea4a85ae834fadc1eefbd80005b80e2d/7ae55337889db4f789432b6110ca9ca51d97dfff460e395309e2d123abf0ccaa/JANJANSEN/1000AA1/2000AA22/3000AA333/4000AA444A/5000AA555BIS' die dus wel degelijk naar de webserver wordt verzonden, en daar op zijn allerminst in het access log terecht komt.
De QR code zou dus nooit zo een kale URL moeten bevatten, maar dan slechts de hashes en andere info. De ambtenaar die de code scant heeft dan een app nodig die de QR interpreteert, een check bij de webservice doet op geldigheid van de hashes, en dan lokaal de postcodes toont.

Die app zal overigens ook meer moeten doen. Als de webservice niets met de postcodes doet, kan ik gemakkelijk een eigen QR maken met dezelfde hashes, maar andere postcodes. De webservice vind het prima, en de app op het device van de ambtenaar toont de door mij zelf gewijzigde postcodes. Ik kan dus overal heen. En omdat de hash code 2 wordt gegenereerd met een random nummer, kan zowel de webservice (als die er wel naar zou kijken) als het scanning device ook nooit controleren of de postcode lijst uit mijn URL wel klopt)

Edit: ik zie nu dat je de willekeurige code ook in de URL zet. Dat staat niet zo in je readme :) (Verplaatsbewijs aanmaken punt 7)
Dat lost dan wellicht het aanpassen van de postcode lijst op, omdat die code 2 hash dan vergeleken kan worden. Lost nog niet op dat je wel persoonsgegevens aan de webserver stuurt.

[ Voor 8% gewijzigd door SambalBij op 26-04-2020 13:59 ]

Sometimes you just have to sit back, relax, and let the train wreck itself


Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 30-09 11:34
Sorry dat ik alleen kort reageer en geen betere bron heb, maar ik maak dus gebruik van dit principe om de naam en postcode af te schermen van de server:
When an agent (such as a web browser) requests a web resource from a web server, the agent sends the URI to the server, but does not send the fragment.
Wikipedia: Fragment identifier

Het "fragment" is hier dus de waarde die na het #-teken komt.

[ Voor 7% gewijzigd door Skit3000 op 26-04-2020 14:53 ]

Pagina: 1