Technische werking
Architectuur
See It Once bestaat uit drie Docker-containers die via een intern netwerk communiceren:
een Nginx-frontend die de interface serveert, een
Node.js/Express-backend die de REST API aanbiedt, en
Redis als in-memory datastore met ingebouwde TTL-ondersteuning.
Alle API-verzoeken van de browser lopen via de Nginx-proxy naar de backend —
de browser communiceert nooit rechtstreeks met Node.js.
Secret aanmaken
Voordat er iets naar de server wordt gestuurd, versleutelt de browser het secret
lokaal met AES-256-GCM. De backend genereert een willekeurige
id (16 bytes) en key (32 bytes). De versleutelde
blob wordt opgeslagen in Redis onder secret:{id} met de gekozen TTL.
De key wordt uitsluitend meegegeven in de gegenereerde link en
wordt nooit door de server opgeslagen.
Extra wachtwoord (tweede versleutelingslaag)
Als de gebruiker een extra wachtwoord instelt, versleutelt de browser het secret
vóór verzending een tweede keer via
PBKDF2 (200.000 iteraties, SHA-256) gevolgd door
AES-256-GCM. Het wachtwoord verlaat de browser nooit.
De server ontvangt en bewaart uitsluitend de dubbel-versleutelde blob —
zelfs de server-operator kan de inhoud niet inzien.
Secret ophalen & verwijderen
De ontvanger opent de link; de browser leest id en key
uit de URL. De backend haalt de versleutelde blob op en verwijdert
secret:{id} uit Redis voordat hij antwoordt.
Na dit moment bestaat het secret nergens meer. De browser ontsleutelt de blob
lokaal met de key uit de URL. Bij een extra wachtwoord ontsleutelt de browser
daarna een tweede keer; pas dan stuurt hij een DELETE-verzoek
naar de backend.
Foutieve wachtwoordpogingen
Bij een verkeerd extra wachtwoord meldt de browser dit via
POST /api/secret/{id}/fail. Na 3 mislukte pogingen
verwijdert de backend het secret definitief, ongeacht de resterende TTL.
Automatisch verlopen
Niet-geopende secrets worden automatisch verwijderd door Redis na de ingestelde
vervaltijd (15 minuten tot 7 dagen). De backend luistert via een aparte
subscriber-verbinding op Redis keyspace-events; zodra een secret verloopt,
worden de statistieken direct bijgewerkt.
Beveiliging — wat de server nooit ziet
De server ontvangt nooit de decryptiesleutel, het extra wachtwoord
of de leesbare tekst van het secret. De enige manier om een secret te lezen is
via de exacte link met de juiste key — en die link is na één gebruik permanent
ongeldig.
Dataflow samengevat
Aanmaken
Browser versleutelt lokaal → verstuurt encrypted blob naar backend →
backend slaat op in Redis met TTL → browser ontvangt id + key →
browser bouwt deelbare link (key verlaat systeem nooit via server)
Ophalen
Browser leest id + key uit URL → backend haalt op & verwijdert uit Redis →
browser ontsleutelt lokaal met key → plaintext getoond,
nergens meer opgeslagen