rilo
Rilos maskoträv som står vid en sköld med ett hänglås på

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.

accounts sparas tills du raderar det
  • 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
Din kontorad står kvar tills du raderar den, och att radera den i appen tar den här raden och allt som hänger på den med sig. Vi jobbar på att rensa ut familjer som helt slutat använda Rilo. Tills det är påslaget försvinner inget här av sig själv.
server_state sparas
  • keyvad som hålls i minnet
  • valueoch vad det säger
Den enda tabellen här som inte handlar om din familj alls. I dag innehåller den en sak, nämligen ögonblicket då den här versionen av servern startade första gången. Alla frågor om vem som har tystnat mäts från då, så en databas som skrevs innan vi kunde se det kan aldrig läsas som månader av tystnad.
guardians sparas
  • account_id
  • guardian_keyen nyckel som får agera för det här barnet
  • added_at
  • removed_at
Borttagning markeras, den suddas inte ut. Kontakter kontrolleras mot vem som var vårdnadshavare när kontakten signerades, så att en förälder som lämnar kontot inte tyst klipper varje vänskap de någonsin godkänt.
devices sparas
  • 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
Telefonerna och surfplattorna en person pratar från. Den säger hur många enheter din familj har och absolut ingenting om vem du pratar med, precis som de två tabellerna ovanför. En telefon släpps in av en signatur från en enhet som redan står på listan, aldrig av oss, och den signaturen sparas här så att vilken telefon som helst kan kontrollera den i stället för att tro på listan. Att pensionera en telefon markerar raden i stället för att sudda ut den, av samma skäl som en vuxen som lämnar markeras. Allt den signerade medan den var din måste gå att kontrollera även efteråt.
push_tokens sparas
  • account_id
  • device_keyvilken av dina telefoner den här ringer
  • platformapns eller fcm
  • tokenett ogenomskinligt handtag från Apple eller Google
  • updated_at
En per enhet, så att ett samtal kan ringa en telefon som sover. Pushen bär inget namn och inget innehåll.
used_nonces sopas bort
  • nonce
  • expires_at
En lista över engångsnummer som redan är använda, så att en fångad förfrågan inte kan spelas upp igen. Raderas när den går ut.
denied_edges sopas bort
  • edge_hashen hash av paret, inte de två personerna
  • denied_at
  • expires_at
När en vuxen säger nej till en introduktion minns det här nejet i tre dagar, så att den andra förälderns telefon, avstängd just då, inte kan fullborda den av misstag. En ny skanning mellan samma familjer rensar det tidigare. Inga namn, inga nycklar, bara en hash och två datum.
pending_grants sopas bort
  • 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
Det här är det enda stället där servern håller något som liknar ett socialt nätverk, och den håller det bara medan en introduktion är oavslutad. Ingen svarade inom 72 timmar och då förfaller den. Svarat, men telefonen den var tänkt för kom aldrig online, då gäller 30 dagar. När båda telefonerna har den färdiga kontakten raderas raden. Därför finns det ingen tabell över kontakter på den här sidan. Det finns ingen tabell över kontakter.
messages raderas vid leverans
  • 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
En telefon är avstängd större delen av dagen, och ett meddelande som tyst försvinner är en trasig produkt. Så en förseglad låda väntar här i högst 30 dagar, och raderas i samma stund som mottagaren bekräftar att de har den. Vi kan inte öppna en.
revocations sparas
  • 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
Det enda vi sparar på obestämd tid. Det noterar att en kontakt klipptes utan att vara en läsbar lista över vem som kände vem.
roster_changes sparas
  • 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
De två nätterna mellan att någon signerar en ändring av ett barns vuxna och att ändringen är sann. En telefon som kommer med i en familj, eller en som kastas av, väntar här där varje annan telefon på kontot kan se den och invända. Raden står kvar efter att den avgjorts, för en telefon som var avstängd måste kunna kontrollera vad som hände i stället för att lita på vårt ord. Den har kontot och nycklarna det gäller, vilket är mer än de flesta tabeller här.
roster_change_votes sparas
  • change_idvilken väntande ändring
  • voter_keyvilken vuxen
  • decisionsläpp igenom, eller stoppa
  • recordderas signatur
  • at
En rad per vuxen snarare än en räknare. En majoritet av ett barns vuxna kan avsluta de två nätternas väntan tidigt, och om det finns en majoritet måste frågas igen mot de vuxna som finns nu. Någon som lämnat är ingen röst, och en räknare kunde inte veta det.
device_revocations sparas
  • 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
En stulen telefon, och skillnaden mellan det här och att pensionera en. Att pensionera betyder att den inte kan agera längre från nu, vilket är rätt svar för en telefon någon bytt ut. Det här betyder misstro allt den någonsin signerat, vilket andra telefoner måste kunna kontrollera utan att fråga oss. Bara stöld får en rad.
retirements sparas
  • account_idkontot som är borta
  • retired_at
  • recorddet signerade beviset, gjort med det kontots egen nyckel innan nyckeln förstördes
En lista över frånvaro, och den goda nyheten är den andra kolumnen. När någon lämnar Rilo får deras vänners telefoner en signatur gjord med den personens egen nyckel. En familj får veta att någon är borta genom ett bevis, inte genom att vi säger det. Inget vi kunde säga på egen hand kan ta bort ett ansikte från ditt barns skärm. Det är den enda tabellen här utan länk tillbaka till ett konto, för den måste överleva det konto den handlar om.
entitlements sparas
  • 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
Inget här identifierar en person. Inget butikskonto, inget Apple-ID, inget Google-konto, inget namn, ingen e-post, inget kort. Vilka barn en betalning täcker räknas ut från vårdnadshavartabellen när frågan ställs, och skrivs aldrig ner.
roster_notices sopas bort
  • 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
En kö, och skälet till att det sägs högt när en telefon läggs till eller tas bort. Varje telefon i familjen får höra det, och för ett barn får varje vuxen som ansvarar för det höra det också, inklusive telefonen som just togs bort. Så får någon som inte borde ha den veta att du märkte det. En avisering innehåller inget som ändringen själv inte innehåller, och den raderas när den går ut vare sig vi lyckades leverera den eller inte.
reports sparas
  • 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
Den enda tabellen här som finns för att få något att hända. Det mesta av en anmälan förseglas på telefonen som skickade den och vi kan inte öppna det. Det som förblir läsbart är vem den handlar om, för en anmälan ingen kan agera på är inget skydd. Den överlever kontot den handlar om. Annars kunde vem som helst radera sig ur en. Det finns ingen inspelning av något samtal i den, varken här eller någon annanstans, för ingen görs någonsin.

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.