rilo

Nu even technisch.

Alles wat de voorpagina zegt, uitgeschreven als datgene waaruit het is opgebouwd: de echte database, hoe een contact echt tot stand komt, en wie een gesprek nog meer aanraakt.

Je hebt deze pagina niet nodig om Rilo te gebruiken, en niets hier spreekt de eenvoudigere versie tegen — het is hetzelfde product, alleen precies beschreven.

De volledige database

Alles wat onze server over jouw gezin weet.

Geen samenvatting. Dit zijn de zeven tabellen, met de kolommen die er echt in staan. Vier ervan vormen het account; drie bestaan zodat een telefoon die uit stond niets mist, en twee daarvan wissen zichzelf.

accounts bewaard
  • ideen hash van de publieke sleutel — geen naam
  • public_keyde sleutel van het toestel, die het account is
  • typevolwassene of kind
  • type_certde handtekening die dat bewijst — een kindaccount wordt door een ouder ondertekend, dus er is geen vlaggetje om om te zetten
  • created_at
  • last_active
De gebruikersnaam is weg sinds issue #75. Hij was alleen-schrijven — opgeslagen, aan niemand behalve jezelf teruggegeven, nooit naar een ander toestel gestuurd — dus hij kon alleen botsen, nooit gelezen worden. Die kolom schrappen maakt deze tabel één rij korter en nog steeds waar.
guardians bewaard
  • account_id
  • guardian_keyeen sleutel die voor dit kind mag handelen
  • added_at
  • removed_at
Verwijderen wordt aangetekend, niet uitgewist. Contacten worden getoetst aan wie voogd was toen het contact werd ondertekend, zodat een vertrekkende ouder niet stilletjes elke vriendschap doorknipt die hij ooit heeft goedgekeurd.
push_tokens bewaard
  • account_id
  • platformapns of fcm
  • tokeneen betekenisloos handvat van Apple of Google
  • updated_at
Eén per toestel, zodat een oproep een slapende telefoon kan laten overgaan. De pushmelding bevat geen naam en geen inhoud.
used_nonces opgeruimd
  • nonce
  • expires_at
Een lijst van al gebruikte eenmalige getallen, zodat een onderschept verzoek niet opnieuw kan worden afgespeeld. Wordt gewist zodra het verloopt.
pending_grants gewist bij bezorging
  • edge_hasheen hash van het paar, niet van de twee personen
  • grantde toestemming waarover beslist wordt, en de handtekeningen die er tot nu toe zijn
  • waiting_keywiens handtekening nog ontbreekt
  • requested_by
  • originin persoon gescand, of een ouder die namens het kind handelt
  • created_at
  • expires_at
  • delivered_towelke kanten het al hebben
Dit is de enige plek waar de server iets bewaart dat op een sociaal netwerk lijkt, en hij bewaart het alleen zolang een kennismaking onafgerond is. Niemand antwoordde binnen 72 uur: het vervalt. Wel beantwoord, maar de telefoon waarvoor het bedoeld was kwam nooit online: 30 dagen. Zodra beide telefoons het afgeronde contact hebben, wordt de rij gewist — en daarom staat er op deze pagina geen tabel met contacten. Er is geen tabel met contacten.
messages gewist bij bezorging
  • id
  • recipient_idvoor het routeren moet deze leesbaar zijn
  • sender_idzodat de telefoon weet met wiens sleutel hij het opent
  • edge_hashhet paar, gehasht, zodat dit niet te lezen is als een kaart van wie met wie praat
  • sealedversleutelde tekst. Er is geen tekstkolom en die komt er ook nooit
  • sent_at
  • expires_at
Een telefoon staat het grootste deel van de dag uit, en een bericht dat stilletjes verdwijnt is een kapot product. Dus wacht hier een verzegeld doosje — hoogstens 30 dagen, en gewist zodra de ontvanger bevestigt dat hij het heeft. Wij kunnen er geen openen.
revocations bewaard
  • edge_hashhet paar, gehasht
  • revoked_at
  • recordhet ondertekende bewijs, zodat een telefoon die offline was het verbreken zelf kan controleren in plaats van ons op ons woord te geloven
Het enige wat we onbeperkt bewaren. Het legt vast dat een contact is verbroken, zonder een leesbare lijst te zijn van wie wie kende.

Kolommen die niet bestaan

  • e-mail
  • naam
  • leeftijd
  • foto
  • berichttekst
  • gespreksinhoud
  • belgeschiedenis
  • contactenlijst
  • locatie
  • toestelmodel

Je e-mailadres wordt bij het aanmelden één keer gecontroleerd en in dezelfde beweging vernietigd — er is geen kolom om het in te zetten. Namen en foto’s worden op elke telefoon zelf ingesteld en rechtstreeks aan de andere telefoon doorgegeven; ze bereiken ons nooit, en daarom kun je opa ook “Opa” noemen zonder dat wij het ooit weten. We zouden hier niets van aan iemand kunnen laten zien, ook al wilden we het, en we kunnen er ook niet toe gedwongen worden.

Dit onderdeel komt uit server/src/identity/accounts.ts — het bestand dat de database aanmaakt. Spreken die twee elkaar ooit tegen, dan heeft het bestand gelijk en is deze pagina een fout.

Contacten

Hoe een contact echt tot stand komt.

Iemand toont een eenmalige code op zijn telefoon; de andere telefoon scant die, samen in dezelfde kamer. De code verloopt na tien minuten en werkt één keer. Dat scannen doet twee dingen tegelijk: het start de kennismaking, en het legt de publieke sleutel van de andere telefoon vast, zodat beide telefoons vanaf dat moment precies weten welke sleutel bij welke persoon hoort. Dat is het stuk dat het onmogelijk maakt om er later tussen te gaan zitten — ook voor ons.

Er is nog niets verbonden. Een verantwoordelijke volwassene moet het contact op de eigen telefoon ondertekenen, achter een biometrische controle op dat moment. Wat hij ondertekent is het geheel — wie, met wie, en in welke richting — en die handtekening is wat de server controleert voordat hij ook maar iets doorstuurt. De server heeft geen enkele sleutel waarmee getekend kan worden, dus hij kan geen contact aanmaken, en wie de database steelt evenmin.

Zodra beide telefoons het afgeronde contact hebben, wordt de rij gewist en bestaat het contact alleen nog op de twee toestellen. Het later verbreken schrijft een ondertekende intrekking, en dat is het enige wat onbeperkt bewaard blijft — opgeslagen als een hash van het paar, zodat het vertelt dát een contact eindigde zonder te vertellen wie wie kende.

Wie er nog meer bij betrokken zijn

Drie bedrijven raken een gesprek aan. Geen van drieën kan het horen.

Er zijn drie bedrijven bij betrokken om een oproep te laten overgaan. Dit is wat elk van hen wel en niet kan zien.

  • Apple & Google

    Pushmeldingen, zodat een oproep een slapende telefoon laat overgaan. Op beide platforms onvermijdelijk. Ze bevatten een betekenisloos kenmerk en verder niets — geen naam, geen nummer, geen inhoud.

  • Cloudflare

    Ongeveer één op de zes gesprekken krijgt de twee telefoons niet rechtstreeks verbonden — hotelwifi, sommige mobiele netwerken — en gaat via een tussenstation. Dat station geeft versleutelde pakketjes door die het niet kan openen, maar het ziet wél dat twee anonieme kenmerken verbonden waren, wanneer, hoe lang en vanaf welke adressen. Dat is precies het soort metagegevens waar wij trots op zijn ze niet te bewaren, en die iemand anders dus wel heeft. We schrijven het liever hier op dan dat je het in een of ander reglement ontdekt.

  • Wij

    De tabel hierboven. Eén kleine server in Nederland die twee telefoons aan elkaar voorstelt en zich daarna terugtrekt.