Architectuur
Hoe sync werkt zonder server.
beatrax synchroniseert tussen je eigen apparaten, end-to-end versleuteld, zonder account en zonder dienst ertussen die iets kan lezen. Zo ongeveer werkt dat.
Het probleem met gewone sync
De gebruikelijke manier om een app te synchroniseren is de gegevens op een server zetten en elk apparaat daarmee laten praten. Die server wordt dan de bron van waarheid, wat betekent dat hij alles kan lezen, en dat iemand hem voor altijd moet draaien en betalen.
beatrax kiest de andere route: elk apparaat houdt een volledige kopie, en ze stemmen rechtstreeks met elkaar af.
Elke wijziging is een regel in een logboek
In plaats van de database te synchroniseren, synchroniseert beatrax de geschiedenis van wijzigingen erop. Elke bewerking wordt een regel in een logboek waar alleen aan toegevoegd wordt, ondertekend door het apparaat dat hem maakte en voorzien van een hybride logische klok, zodat regels van verschillende apparaten consistent geordend kunnen worden ook als hun klokken niet gelijklopen.
De database is vervolgens een afgeleide van dat samengevoegde logboek — speel het logboek af en je krijgt dezelfde database, elke keer. Twee apparaten die dezelfde regels gezien hebben, komen altijd op dezelfde toestand uit.
Conflicten worden per regel opgelost, niet op geluk
Bewerken twee apparaten hetzelfde terwijl ze los van elkaar staan, dan wordt de samenvoeging per veld beslist door een vastgelegde regel in plaats van door wie het laatst synchroniseerde. Verzamelingen voegen samen als verzamelingen; verwijderingen winnen van gelijktijdige bewerkingen waar dat het veilige antwoord is; geïmporteerde regels ontdubbelen op dezelfde vingerafdruk die de import toch al gebruikt, zodat hetzelfde afschrift op twee apparaten geen twee administraties oplevert.
Apparaten bewijzen wie ze zijn
- Elk apparaat maakt zijn eigen identiteit — Een ondertekensleutel en een sleutel voor sleuteluitwisseling, bij de eerste start op het apparaat aangemaakt. De privéhelften verlaten het nooit.
- Koppelen is bewust en geverifieerd — Een nieuw apparaat doet mee via een QR-code of een ingetypte woordcode met een eenmalig geheim, en op beide schermen verschijnt een veiligheidsnummer dat moet overeenkomen voordat er iets synchroniseert.
- Sessies zijn wederzijds geauthenticeerd — Gekoppelde apparaten zetten een forward-secret versleutelde sessie op, zodat een opgenomen sessie later niet alsnog te ontcijferen is als er ooit een sleutel uitlekt.
Direct als het kan, via een relay als het moet
Twee apparaten die aan staan op hetzelfde netwerk vinden elkaar en synchroniseren rechtstreeks — er verlaat niets je huis. Slaapt er één, dan wachten wijzigingen in een doorgeefrelay.
Die relay is met opzet oninteressant: hij bewaart versleutelde tekst waar hij geen sleutel voor heeft, kan niet zien wat er veranderd is, en vergeet het zodra het bezorgd is. Een brievenbus, geen database.
Ook versleuteld waar het stilstaat
Gevoelige velden worden op schijf versleuteld met een sleutel die uit je wachtwoordzin is afgeleid en pas vrijkomt als je de app ontgrendelt. Een apparaat verwijderen roteert de gedeelde groepssleutel en verpakt hem opnieuw voor de apparaten die je houdt — zodat een verwijderd apparaat niets kan lezen van wat er daarna verstuurd is.
Hoe ver dit is
De samenvoegmotor, het koppelen van apparaten, het versleutelde transport, de relay en de versleuteling op schijf staan allemaal op de ontwikkellijn. De mobiele client als volwaardige sync-peer is het onderdeel dat nog loopt. De roadmap houdt dat eerlijk bij.