Het register

Het afzenderregister

Watstaater vergelijkt de afzender van je brief met een lijst van organisaties. Die lijst heet het afzenderregister. Hier lees je hoe dat werkt, en wat de spelregels zijn.

Wat staat erin?

Per organisatie staat er bijvoorbeeld:

  • de naam;
  • de websites;
  • de rekeningnummers, en vanaf of tot wanneer ze gelden;
  • soms een telefoonnummer;
  • wat die organisatie nooit doet. Bijvoorbeeld: 'Vraagt nooit om te betalen via e-mail, sms, WhatsApp of telefoon.'

Bij elke organisatie staat ook waar we de gegevens hebben gevonden. Dat noemen we de bron. En de datum waarop we ze hebben gecontroleerd.

De spelregels

  1. Alleen organisaties. In het register staan alleen rechtspersonen. Dat zijn organisaties, zoals een gemeente, een stichting of een bv. Ook overheden horen erbij. Nooit gewone mensen. Een eenmanszaak zetten we er ook niet in. Daarachter zit namelijk één persoon.
  2. Elk gegeven heeft een bron en een datum. We schrijven op waar we het hebben gevonden. Meestal is dat de eigen website van de organisatie. En we schrijven op wanneer we het hebben gecontroleerd.
  3. Een controle telt een half jaar. Is een gegeven langer dan een half jaar niet gecontroleerd? Dan stelt Watstaater je er niet meer mee gerust. Je ziet dan: 'Niet recent gecontroleerd'.
  4. Neutrale woorden. We zeggen alleen of iets klopt met het register. Dat gaat over het bericht. Niet over een persoon of een bedrijf.
  5. Nooit een oordeel over een persoon. We noemen nooit iemand een oplichter. Ook geen bedrijf of organisatie. We kijken alleen of een bericht op oplichting lijkt.
  6. Niet in het register zegt niets. Er staan lang niet alle organisaties in. Staat een afzender er niet in? Dan is die afzender niet verdacht. We weten het dan alleen niet.
  7. Het oordeel is nooit te koop. Een plek in het register is gratis. Geen enkele organisatie kan betalen voor een beter oordeel. Komt er later een betaalde extra voor organisaties? Dan alleen onder toezicht van een onafhankelijke raad. En dan lees je dat eerst hier.

Wat zegt Watstaater over een bericht?

Over een bericht zegt Watstaater een van deze vier dingen:

Pas op: dit lijkt op oplichting
We zien duidelijke signalen van oplichting. Betaal niets, klik niet op links en log nergens in.
Let op: check dit eerst
Er klopt iets niet. Neem zelf contact op met de afzender. Zoek het nummer of de website zelf op.
Afzender en rekeningnummer kloppen met het register
Het rekeningnummer staat in het register bij die afzender. Dat zegt niet dat alles in de brief klopt. Lees de brief dus altijd zelf.
Geen alarmsignalen gevonden
We zien geen signalen van oplichting. Toch weten we niet of de brief echt is. De zin eronder zegt waarom: de afzender staat niet in het register, we hebben de gegevens niet recent gecontroleerd, of er staat geen rekeningnummer in de brief om te vergelijken.

Over een rekeningnummer zegt Watstaater:

  • 'staat in het register bij …';
  • 'wijkt af van het register': het nummer hoort niet bij deze afzender;
  • 'staat niet in het register';
  • 'bestaat niet': elk rekeningnummer heeft een controlegetal, en dat klopt hier niet.

Hoe zeker is een gegeven?

Elke organisatie in het register heeft een status:

Bevestigd
We hebben de gegevens zelf gecontroleerd op de website van de organisatie. Alleen deze gegevens tellen mee bij je eigen brieven.
Nog niet bevestigd
We hebben de gegevens gevonden, maar nog niet zelf gecontroleerd. Ze tellen alleen mee bij de voorbeeldbrieven.
Voorbeeld
Een verzonnen organisatie. Die bestaat niet echt. We gebruiken haar alleen voor de voorbeeldbrieven. Je ziet haar daarom niet in de lijst hieronder.

Wat staat er nu in?

Zie je hier geen lijst met organisaties in het register? Bekijk dan het bestand register.json. Dat is technisch, maar je kunt het wel lezen.

Klopt er iets niet?

Zie je een fout in het register? Of hoort jouw organisatie erin? Laat het ons weten.

  1. Mail naar info@wervora.nl. Zet in het onderwerp: Correctie register. Stuur nooit je brief, een foto of je BSN.
  2. Schrijf welke organisatie het is en wat er niet klopt. Schrijf ook waar wij het goede gegeven kunnen vinden. Bijvoorbeeld op welke pagina van de eigen website van de organisatie.
  3. We reageren zo snel als we kunnen. In ons antwoord staat nooit een link of een bijlage.
  4. We controleren het zelf bij de bron. Klopt je melding? Dan passen we het register aan, na een tweede controle.

We veranderen nooit iets alleen op basis van een mail. Ook niet als die er officieel uitziet. We controleren het eerst zelf, op de eigen website van de organisatie. Of we bellen de organisatie, op een nummer dat we zelf opzoeken. Zo kan een oplichter het register niet veranderen.

Kan een fout gegeven schade doen? Dan halen we het meteen uit het register, totdat we het hebben gecontroleerd. Staat er per ongeluk iets over een persoon in? Dan halen we dat er meteen uit.

De digitale handtekening

Elk record in het register heeft een digitale handtekening. Een record is alles wat we over één organisatie weten.

De handtekening werkt als een zegel. Verandert iemand ook maar één letter of cijfer in het record? Dan klopt de handtekening niet meer.

Ook onder de lijst zelf staat een handtekening. In die lijst staat welke organisaties er in deze versie van het register staan, en welk nummer die versie heeft. Haalt iemand een organisatie weg? Zet iemand er een bij, of een organisatie twee keer? Of zet iemand een oude versie terug? Dan klopt het niet meer met die handtekening.

Je toestel controleert alle handtekeningen zelf, elke keer als Watstaater het register laadt. Klopt de handtekening van een record niet? Dan telt dat record niet mee. Klopt de lijst niet? Is het register ouder dan Watstaater verwacht? Of kan je toestel de handtekening niet controleren? Dan werkt Watstaater zonder register. Dat zie je bij de uitkomst, in het blok 'Waarom zeggen we dit?'.

Alleen wij kunnen een handtekening zetten. Daarvoor hebben we een geheime sleutel. Iedereen kan de handtekening controleren, met de publieke sleutel. Watstaater kent de vingerafdruk van onze publieke sleutel zelf. Is het register met een andere sleutel getekend? Dan gebruikt Watstaater het niet. Dit is de vingerafdruk van onze publieke sleutel:

Vingerafdruk van de sleutel (SHA-256):

0771 e7b2 dd33 c440 a851 0068 2921 f8eb 519a 8563 a44a 70bb 3262 b556 c4c2 ce65 of bc3c 7fc4 4c10 ec40 b4a5 3287 dddc 9ae0 6ac5 fc8e 880b 31b1 e9ae b873 bd14 4345

Wil je zeker weten dat het register van ons komt? Vraag de vingerafdruk dan ook bij ons op, via info@wervora.nl. Stuur nooit je brief, een foto of je BSN. Is de vingerafdruk hetzelfde? Dan komt het register van ons.

Zelf controleren

Je hoeft ons niet op ons woord te geloven. Met een computer kun je de handtekeningen zelf narekenen.

Voor wie het technisch wil controleren

We tekenen elk record en de lijst met ECDSA op de curve P-256, met SHA-256. Zo doe je de controle:

  1. Download register.json en register.sig.json.
  2. Maak van elk record de canonieke JSON. Sorteer de sleutels van elk object, ook diep in het record, met Array.prototype.sort(). Laat lijsten in hun volgorde. Schrijf alles met JSON.stringify, zonder spaties.
  3. Controleer de handtekening van elk record met de publieke sleutel uit register.sig.json. De handtekening staat er in base64. Het zijn 64 bytes: r en s achter elkaar, zoals WebCrypto ze maakt.
  4. Controleer de lijst. Die staat in register.sig.json bij 'manifest': het nummer van de versie ('versie'), de id's van alle records ('ids') en van elk record de SHA-256 van zijn canonieke JSON ('hashes'). De handtekening over de canonieke JSON van het manifest staat bij 'manifestHandtekening'. Elke id moet precies één keer in register.json staan, en register.json moet precies de records uit 'ids' hebben.
  5. Bereken de SHA-256 van de publieke sleutel in SPKI-vorm. Die moet gelijk zijn aan de vingerafdruk hierboven.

Dit script doet dat in Node.js, versie 20 of nieuwer. Zet het naast de twee bestanden en start het met node controleer.mjs.

// controleer.mjs · start met: node controleer.mjs (Node.js 20 of nieuwer)
// Zet register.json en register.sig.json in dezelfde map als dit script.
import { readFile } from 'node:fs/promises';

const { subtle } = globalThis.crypto;
const lees = async (bestand) => JSON.parse(await readFile(bestand, 'utf8'));
const register = await lees('register.json');
const sig = await lees('register.sig.json');
const meld = (goed, wat) => console.log(goed ? 'klopt      ' : 'KLOPT NIET ', wat);

// Canonieke JSON: sleutels gesorteerd (ook diep in het record), lijsten in hun volgorde, geen spaties.
const sorteer = (w) => Array.isArray(w) ? w.map(sorteer)
  : w && typeof w === 'object'
    ? Object.fromEntries(Object.keys(w).sort().map((k) => [k, sorteer(w[k])]))
    : w;
const canoniek = (record) => JSON.stringify(sorteer(record));
const bytes = (tekst) => new TextEncoder().encode(tekst);
const hex = (buffer) => Buffer.from(buffer).toString('hex');

const sleutel = await subtle.importKey('jwk', sig.publiekeSleutel,
  { name: 'ECDSA', namedCurve: 'P-256' }, true, ['verify']);
const getekend = async (handtekening, tekst) => {
  const h = Buffer.from(handtekening ?? '', 'base64');
  return h.length === 64 && subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, sleutel, h, bytes(tekst));
};

// 1. De lijst: getekend, elke id één keer, precies de records uit de lijst, dezelfde versie.
const lijst = sig.manifest ?? { ids: [], hashes: {} };
meld(await getekend(sig.manifestHandtekening, canoniek(lijst)), `de lijst (versie ${lijst.versie})`);
const ids = register.records.map((record) => record.id);
meld(new Set(ids).size === ids.length, 'elke id staat er één keer in');
meld(JSON.stringify([...ids].sort()) === JSON.stringify([...lijst.ids].sort()), 'precies de records uit de lijst');
meld(register.versie === lijst.versie, 'versie van register.json');

// 2. Elk record: de handtekening klopt, en de inhoud is dezelfde als in de lijst.
for (const record of register.records) {
  const tekst = canoniek(record);
  const zelfde = lijst.hashes[record.id] === hex(await subtle.digest('SHA-256', bytes(tekst)));
  meld(zelfde && await getekend(sig.handtekeningen[record.id], tekst), record.id);
}

// 3. De sleutel: vergelijk deze vingerafdruk met die op de pagina.
const vingerafdruk = hex(await subtle.digest('SHA-256', await subtle.exportKey('spki', sleutel)));
console.log('vingerafdruk', vingerafdruk.replace(/(.{4})(?=.)/g, '$1 '));

Staat er ergens 'KLOPT NIET'? Of is de vingerafdruk anders dan op deze pagina? Mail ons dan. Stuur nooit je brief, een foto of je BSN.