Nu blir det tekniskt.
Allt förstasidan säger, skrivet ut som det som det byggdes av. Den riktiga databasen, hur en kontakt faktiskt skapas, och vem annan som rör ett samtal.
Du behöver inte den här sidan för att använda Rilo, och inget här motsäger den enklare versionen. Det är samma produkt, beskriven exakt.
Hela databasen
Allt vår server vet om din familj.
Ingen sammanfattning. Det här är de sjutton tabeller servern har, med de kolumner de har. Fyra är din familj, alltså vilka de är, vem som får agera för ett barn, telefonerna de pratar från och var man ringer dem. Fyra håller något åt en telefon som var avstängd, och alla fyra raderar sig själva. Tre handlar om vem som får agera för ett barn och vilken telefon som slutade vara betrodd. Två är signerade spår av ett slut, en kontakt som klippts eller någon som är borta. De sparas så att en telefon som varit offline kan kontrollera dem i stället för att tro på oss. En är använda engångsnummer, som sopas bort när de går ut. En är abonnemanget, och den innehåller inget som namnger någon. En är en anmälan som en vuxen skickade oss, och det är den enda tabellen här som finns för att få något att hända. Den sista handlar inte om din familj alls.
- iden hash av den publika nyckeln, inte ett namn
- public_keyenhetsnyckeln som är kontot
- typevuxen eller barn
- type_certsignaturen som bevisar det. Ett barnkonto signeras av en förälder, så det finns ingen flagga att vända
- created_at
- last_activesenaste gången någon av dina telefoner hörde av sig
- dormant_warned_attom
- consent_sealede-postadressen du registrerade dig med, förseglad till en nyckel som ligger på papper hos grundaren. Ingen server kan läsa den
- uncovered_sincetom, om inte din prenumeration slutat täcka det här barnet — då dagen vi märkte det, så att månaden innan något slutar börjar där
- keyvad som hålls i minnet
- valueoch vad det säger
- account_id
- guardian_keyen nyckel som får agera för det här barnet
- added_at
- removed_at
- account_id
- device_keyen telefons egen nyckel. En person kan prata från fler än en
- agreement_keynyckeln ett meddelande förseglas till, så att bara den telefonen kan öppna det
- certsignaturen som släppte in den här telefonen, sparad ord för ord så att din telefon kan kontrollera den i stället för att tro på oss
- kinden telefon, eller det utskrivna återställningsbladet
- added_at
- removed_at
- account_id
- device_keyvilken av dina telefoner den här ringer
- platformapns eller fcm
- tokenett ogenomskinligt handtag från Apple eller Google
- updated_at
- nonce
- expires_at
- edge_hashen hash av paret, inte de två personerna
- denied_at
- expires_at
- edge_hashen hash av paret, inte de två personerna
- grant_recordbehörigheten som avgörs, och signaturerna som samlats in så långt
- waiting_keyvems signatur som fortfarande saknas
- requested_bytelefonen som frågade, så att en telefon inte kan överösa en familj med frågor
- originskannad på plats, eller en förälder som agerar för sitt barn
- delivered_tovilka telefoner som redan har den
- declaredden frågande sidans eget namn, förseglat så att bara familjen de skannade kan läsa det
- created_at
- expires_at
- id
- recipient_idroutningen behöver den här i klartext
- recipient_devicevilken av deras telefoner lådan är förseglad för. Varje telefon har sin egen nyckel, så varje telefon får sin egen låda
- sender_idså att telefonen vet vems nyckel som öppnar den
- sender_devicevilken av deras telefoner som förseglade den, så att rätt kopia hittar rätt lås
- edge_hashparet, hashat, så att det här inte kan läsas som en karta över vem som pratar med vem
- sealedkryptotext. Det finns ingen textkolumn och kommer aldrig att finnas
- sent_at
- expires_at
- edge_hashparet, hashat
- revoked_at
- recorddet signerade beviset, så att en telefon som var offline kan kontrollera klippet själv i stället för att lita på vårt ord
- id
- account_idvems lista över telefoner och vuxna som ändras
- kindkommer med, eller tas bort
- subject_keytelefonen eller den vuxna det handlar om
- subject_kindvilken av de två
- agreement_keyden andra nyckeln en telefon behöver, tom för papper
- recordsignaturen själv, sparad ord för ord så att en telefon kan kontrollera den i stället för att tro på oss
- signed_byvilken nyckel som signerade den
- by_authorityom ett återställningsblad signerade den, vilket är vad som gör att den väntar
- issued_atögonblicket signeraren påstår, aldrig vår klocka
- reasontom, om inte signeraren skrev en
- proposed_at
- effective_atnär den blir sann, två nätter efter att den föreslogs
- contested_at
- contested_byvem som invände, och signaturen de invände med
- contest_record
- resolved_at
- resolutiontillämpad eller avbruten, när det har avgjorts
- change_idvilken väntande ändring
- voter_keyvilken vuxen
- decisionsläpp igenom, eller stoppa
- recordderas signatur
- at
- account_idvems telefon det var
- device_keynyckeln som blev stulen
- revoked_at
- recorddet signerade beviset, så att en telefon kan kontrollera det utan att fråga oss
- account_idkontot som är borta
- retired_at
- recorddet signerade beviset, gjort med det kontots egen nyckel innan nyckeln förstördes
- account_id
- storeapple, google eller på huset
- store_refett ogenomskinligt handtag från butiken. Det är det enda som låter oss ställa en fråga till den senare
- store_ref_hashett fingeravtryck av handtaget ovan. Det är vad som hindrar ett kvitto från att täcka två konton
- environment
- stateactive, grace, lapsed, lapsed_trial eller disabled
- seatshur många barn det täcker. Ett tal, aldrig deras namn
- expires_at
- acts_at
- updated_at
- device_keytelefonen som inte har fått veta än
- change_idvilken ändring det handlar om
- whatföreslagen, bestridd eller avgjord
- account_idvems lista över telefoner som ändrades. När en vuxen får veta om sitt barn är det här barnet
- subject_keytelefonen som lades till eller togs bort
- effective_at
- created_at
- expires_at
- delivered_atnär vi lyckades säga det, eller tom för att vi inte har gjort det
- id
- about_keyvem anmälan handlar om. Läsbart, så att någon kan agera på det
- reasonvilken av sex saker som hände, som den vuxna som anmälde valde det
- csa
- sealeddet som skrevs, förseglat på telefonen som skickade det med en nyckel som ligger på papper hos grundaren. Ingen server kan läsa det
- sealed_digestett fingeravtryck av den förseglade delen, så att det som öppnas senare bevisligen är det som kom in
- received_at
- edge_snapshotvem som hade fått nå vem, och vilken vuxen som tillät det, som det såg ut i det ögonblicket. Den här går inte att rekonstruera efteråt
- reporter_keyvem som skickade den, eller ingenting alls när den skickades utan namn
- source
- sealed_key
- receiptreferensen avsändaren behåller. Det är enda sättet vi kan svara någon om en anmälan vi inte kan öppna
- acknowledged_at
- decided_at
- actioned_at
- escalated_at
- decided_by
- outcome
Kolumner som inte finns
- e-post
- namn
- ålder
- foto
- meddelandetext
- samtalsinnehåll
- samtalshistorik
- kontaktlista
- plats
- telefonmodell
Din e-postadress kontrolleras en gång när du registrerar dig och förseglas i samma andetag, till en nyckel som ligger på papper hos grundaren och aldrig har rört en server. Lagen ber oss kunna bevisa att en vuxen gick med på det. Vi skulle inte kunna läsa den själva. Namn och foton sätts på varje telefon och lämnas direkt till den andra telefonen. De når oss aldrig, vilket också är därför du kan döpa om morfar till “Boffa” utan att vi någonsin får veta det. Vi skulle inte kunna visa något av det här för någon om vi ville, och vi kan inte tvingas till det.
Det här avsnittet genereras från serverns eget schema, i accounts.ts och roster-changes.ts, de två filerna som skapar databasen. Om de någon gång säger emot varandra är filerna rätt och den här sidan en bugg.
Kontakter
Så skapas en kontakt egentligen.
Någons telefon gör en engångsinbjudan. Den andra telefonen läser den, skannad från en skärm i samma rum eller öppnad från en länk som den vuxna skickade. Att läsa den startar introduktionen och sparar i samma ögonblick den andra telefonens publika nyckel, så att båda telefonerna vet precis vilken nyckel som hör till vilken person från då. Det är den delen som gör det omöjligt att sitta mitt i ett senare samtal, även för oss. Inget av det kopplas ihop förrän en vuxen på andra sidan har sagt ja.
Fortfarande ingen kontakt. En ansvarig vuxen måste signera kontakten på sin egen telefon, bakom en biometrisk kontroll gjord i det ögonblicket. Vad de signerar är hela saken. Vem, med vem, och i vilken riktning. Deras signatur är vad servern kontrollerar innan den skickar vidare något. Servern har ingen nyckel som kan signera, så den kan inte skapa en kontakt, och det kan ingen som stjäl databasen heller.
När båda telefonerna har den färdiga kontakten raderas raden och kontakten finns bara på de två enheterna. Att klippa den senare skriver en signerad återkallelse, och det är den enda posten vi sparar på obestämd tid. Den lagras som en hash av paret, så den säger att en kontakt tog slut utan att säga vem som kände vem.
Vilka andra är inblandade
Tre företag rör ett samtal. Inget av dem kan höra det.
Sex andra företag rör tjänsten, och de står alla i integritetspolicyn. Tre av dem är inblandade i att få ett samtal att ringa, och det här är vad var och en av de tre kan och inte kan se.
-
Apple & Google
Push-aviseringar, så att ett samtal ringer en telefon som sover. Oundvikligt på båda plattformarna. De bär en ogenomskinlig identifierare och inget annat. Inget namn, inget nummer, inget innehåll.
-
Cloudflare
Ungefär ett samtal av sex kan inte koppla de två telefonerna direkt, på hotell-Wi-Fi eller vissa mobilnät, och skickas i stället via en relä. Relän vidarebefordrar krypterade paket som den inte kan öppna, men den ser att två anonyma id:n kopplades ihop, när, hur länge och från vilka adresser. Det är metadata som vi inte sparar, men som någon annan har.
-
Vi
Tabellen ovanför. En liten server i Nederländerna som presenterar två telefoner för varandra och sen kliver undan.