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 zeventien tabellen die de server heeft, met de kolommen die ze hebben. Vier gaan over je gezin: wie ze zijn, wie voor een kind mag optreden, de telefoons waarvandaan ze praten, en waar je ze kunt bereiken. Vier houden iets vast voor een telefoon die uit stond, en alle vier wissen zichzelf. Drie gaan over wie voor een kind mag optreden en welke telefoon niet langer vertrouwd wordt. Twee zijn ondertekende sporen van een einde: een contact dat is doorgeknipt, of iemand die weg is. Ze blijven staan zodat een telefoon die offline was ze kan controleren in plaats van ons te geloven. Eén zijn gebruikte eenmalige nummers, opgeruimd zodra ze verlopen. Eén is het abonnement, en die bevat niets waar een naam in staat. Eén is een melding die een volwassene ons stuurde, en dat is de enige tabel hier die bestaat om iets te laten gebeuren. De laatste gaat helemaal niet over je gezin.
- 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_activede laatste keer dat een van je telefoons hallo zei
- dormant_warned_atleeg
- consent_sealedje aanmeld-e-mail, verzegeld met een sleutel die op papier bij de oprichter ligt. Geen server kan hem lezen
- uncovered_sinceleeg, tenzij je abonnement dit kind niet meer dekt — dan de dag waarop we het merkten, zodat de maand voordat er iets stopt vanaf dan loopt
- keywat er onthouden wordt
- valueen wat het zegt
- account_id
- guardian_keyeen sleutel die voor dit kind mag handelen
- added_at
- removed_at
- account_id
- device_keyde eigen sleutel van één telefoon. Iemand kan vanaf meer dan één toestel praten
- agreement_keyde sleutel waaraan een bericht wordt verzegeld, zodat alleen die telefoon het kan openen
- certde handtekening die deze telefoon binnenliet, woord voor woord bewaard zodat je telefoon hem kan controleren in plaats van ons te geloven
- kindeen telefoon, of het geprinte herstelpapier
- added_at
- removed_at
- account_id
- device_keywelke van je telefoons deze laat overgaan
- platformapns of fcm
- tokeneen betekenisloos handvat van Apple of Google
- updated_at
- nonce
- expires_at
- edge_hasheen hash van het paar, niet van de twee personen
- denied_at
- expires_at
- edge_hasheen hash van het paar, niet van de twee personen
- grant_recordde toestemming waarover beslist wordt, en de handtekeningen die er tot nu toe zijn
- waiting_keywiens handtekening nog ontbreekt
- requested_byde telefoon die het vroeg, zodat één telefoon een gezin niet kan overspoelen met vragen
- originin persoon gescand, of een ouder die namens het kind handelt
- delivered_towelke telefoons het al hebben
- declaredde eigen naam van de vragende kant, verzegeld zodat alleen het gescande gezin hem kan lezen
- created_at
- expires_at
- id
- recipient_idvoor het routeren moet deze leesbaar zijn
- recipient_devicevoor welke van hun telefoons het doosje verzegeld is. Elke telefoon heeft een eigen sleutel, dus elke telefoon krijgt een eigen doosje
- sender_idzodat de telefoon weet met wiens sleutel hij het opent
- sender_devicewelke van hun telefoons hem verzegelde, zodat de juiste kopie het juiste slot vindt
- 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
- 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
- id
- account_idwiens lijst met telefoons en volwassenen verandert
- kinderbij komen, of eraf gaan
- subject_keyde telefoon of de volwassene waar het over gaat
- subject_kindwelke van die twee
- agreement_keyde tweede sleutel die een telefoon nodig heeft, leeg voor papier
- recordde handtekening zelf, woord voor woord bewaard zodat een telefoon hem kan controleren in plaats van ons te geloven
- signed_bywelke sleutel hem heeft ondertekend
- by_authorityof een herstelpapier hem heeft ondertekend, en dat is wat hem laat wachten
- issued_athet moment dat de ondertekenaar noemt, nooit onze klok
- reasonleeg, tenzij de ondertekenaar er een schreef
- proposed_at
- effective_atwanneer het echt wordt, twee nachten nadat het is voorgesteld
- contested_at
- contested_bywie bezwaar maakte, en met welke handtekening
- contest_record
- resolved_at
- resolutiontoegepast of geannuleerd, zodra het rond is
- change_idwelke wachtende wijziging
- voter_keywelke volwassene
- decisiondoorlaten, of tegenhouden
- recordhun handtekening
- at
- account_idwiens telefoon het was
- device_keyde sleutel die gestolen is
- revoked_at
- recordhet ondertekende bewijs, zodat een telefoon het kan controleren zonder het ons te vragen
- account_idhet account dat weg is
- retired_at
- recordhet ondertekende bewijs, gemaakt met de eigen sleutel van dat account voordat die sleutel werd vernietigd
- account_id
- storeapple, google, of van het huis
- store_refeen ondoorzichtige verwijzing van de winkel. Het is het enige waarmee we die later iets kunnen vragen
- store_ref_hasheen vingerafdruk van de verwijzing hierboven. Die zorgt dat één aankoop niet voor twee accounts kan gelden
- environment
- stateactive, grace, lapsed, lapsed_trial of disabled
- seatsvoor hoeveel kinderen het geldt. Een aantal, nooit hun namen
- expires_at
- acts_at
- updated_at
- device_keyde telefoon die het nog niet te horen heeft gekregen
- change_idover welke verandering dit gaat
- whatvoorgesteld, aangevochten of beslist
- account_idwiens lijst met telefoons veranderde. Als een volwassene iets over hun kind te horen krijgt, is dit het kind
- subject_keyde telefoon die erbij kwam of eraf ging
- effective_at
- created_at
- expires_at
- delivered_atwanneer we het hebben kunnen zeggen, of leeg omdat het nog niet gelukt is
- id
- about_keyover wie de melding gaat. Leesbaar, zodat iemand er iets mee kan doen
- reasonwelke van zes dingen er gebeurd is, zoals de volwassene die meldt het gekozen heeft
- csa
- sealedwat er geschreven is, op de verzendende telefoon verzegeld met een sleutel die op papier bij de oprichter ligt. Geen server kan het lezen
- sealed_digesteen vingerafdruk van het verzegelde deel, zodat wat later geopend wordt aantoonbaar is wat er aankwam
- received_at
- edge_snapshotwie tot wie toegang had, en welke volwassene dat had toegestaan, zoals het op dat moment stond. Dit valt later niet te reconstrueren
- reporter_keywie het gestuurd heeft, of helemaal niets als het zonder naam gestuurd is
- source
- sealed_key
- receipthet kenmerk dat de verzender bewaart. Het is de enige manier waarop we iemand kunnen antwoorden over een melding die we niet kunnen openen
- acknowledged_at
- decided_at
- actioned_at
- escalated_at
- decided_by
- outcome
Kolommen die niet bestaan
- naam
- leeftijd
- foto
- berichttekst
- gespreksinhoud
- belgeschiedenis
- contactenlijst
- locatie
- toestelmodel
Je e-mailadres wordt bij het aanmelden één keer gecontroleerd en in dezelfde beweging verzegeld, met een sleutel die op papier bij de oprichter ligt en nooit een server heeft aangeraakt. De wet vraagt dat we kunnen bewijzen dat een volwassene toestemde. We zouden het niet kunnen teruglezen al wilden we het. 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 in de app noemen zoals jullie hem thuis noemen, zonder dat wij dat 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.
Deze sectie is gegenereerd uit het schema van de server zelf, in accounts.ts en roster-changes.ts, de twee bestanden die de database maken. Verschillen ze ooit, dan hebben de bestanden gelijk en is deze pagina de fout.
Contacten
Hoe een contact echt tot stand komt.
Iemands telefoon maakt een eenmalige uitnodiging. De andere telefoon leest die, gescand van een scherm in dezelfde kamer of geopend uit een link die de volwassene stuurde. Dat lezen start de kennismaking en legt op datzelfde moment de publieke sleutel van de andere telefoon vast, zodat beide telefoons voortaan precies weten welke sleutel bij welke persoon hoort. Dat is het stuk dat het onmogelijk maakt om later midden in een gesprek te gaan zitten, ook voor ons. Er gaat nog niets door voordat een volwassene aan de andere kant ja heeft gezegd.
Er is nog niets rond. Een verantwoordelijke volwassene moet het contact op de eigen telefoon ondertekenen, na een biometrische controle op datzelfde moment. Wat er ondertekend wordt is het geheel. Wie, met wie, en in welke richting. 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. Die intrekking wordt opgeslagen als een hash van het paar, zodat ze 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.
Zes andere bedrijven raken de dienst aan, en die staan allemaal in de privacyverklaring. Drie ervan zijn nodig om een oproep te laten overgaan. Dit is wat elk van die drie 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
Bij ongeveer één op de zes gesprekken lukt het niet om de twee telefoons rechtstreeks te verbinden, op hotelwifi of op sommige mobiele netwerken, en gaat het via een tussenstation. Dat tussenstation geeft versleutelde pakketjes door die het niet kan openen, maar het ziet wel dat twee anonieme kenmerken verbonden waren, wanneer, hoe lang en vanaf welke adressen. Dat zijn metagegevens die wij niet bewaren, en die iemand anders dus wel heeft.
-
Wij
De tabel hierboven. Één kleine server in Nederland die twee telefoons aan elkaar voorstelt en zich daarna terugtrekt.