Technische Architektur
Diese Seite beschreibt die kryptografischen und architektonischen Maßnahmen, die Sotto einsetzt, um Anonymität nachweisbar zu garantieren.
Blind RSA Signatures (RSABSSA)
Sotto verwendet RSABSSA-SHA384-PSS-Deterministic nach RFC 9474.
Jede Umfrage generiert ein eigenes 2048-Bit-RSA-Schlüsselpaar. Der öffentliche Schlüssel
ist unter /survey/<id>/trust einsehbar.
Die Implementierung nutzt @cloudflare/blindrsa-ts — die Referenzimplementierung
von Cloudflare, die direkt die Web Crypto API verwendet.
Client Server
│ │
│ 1. POST /redeem (invitation) │
│ ──────────────────────────────────► │ markiert Einladung als eingelöst
│ │
│ blindedMsg = blind(token, pubKey) │
│ 2. POST /sign (blindedMsg) │
│ ──────────────────────────────────► │ signiert blind, ohne token zu kennen
│ ◄──────────────────────────────── │ blindSig
│ │
│ sig = finalize(blindSig, inv) │
│ │
│ 3. POST /submit (answer + sig) │ neue Verbindung, kein Session-Cookie
│ ──────────────────────────────────► │ prüft sig gegen pubKey
│ │ speichert Antwort (Answer-DB)Entscheidend: Zwischen Schritt 2 und 3 liegt ein Verbindungswechsel. Die Einreichung enthält keine Session-ID, keinen Cookie und keinen Referrer. Der Server kann die Signatur prüfen, aber nicht mit der Signieranfrage korrelieren.
Datenbanktrennung
Sotto betreibt zwei physisch getrennte PostgreSQL-Instanzen:
Identity-DB
Einladungen, E-Mail-Hashes, Einlöse-Status, Gruppen. Weiß wer teilnehmen darf.
Answer-DB
Umfragen, Schlüsselpaare, anonyme Antworten, Ergebnis-Snapshots. Weiß was geantwortet wurde.
Es gibt keine Fremdschlüssel, keine gemeinsame Verbindung und keinen JOIN zwischen beiden.
Die einzige Stelle, die beide liest, ist getSurveyProgress() — diese Funktion
gibt ausschließlich Anzahlen zurück, keine Zuordnungen.
k-Anonymität
Ergebnisse werden erst sichtbar, wenn ein Schwellenwert erreicht ist. Numerische Dimensionen werden zusätzlich in Gruppen zusammengefasst (Binning), sodass auch aus der Verteilung keine Rückschlüsse auf einzelne Antworten möglich sind.
Was Sotto nicht schützt
Sotto garantiert Anonymität der Antworten, nicht absolute Privatsphäre. Netzwerkmetadaten (IP-Adresse, Timing) werden bei der Einreichung übertragen. Ein Reverse-Proxy oder VPN kann dieses Risiko mindern. Sotto selbst loggt keine IP-Adressen bei der Einreichung, aber das ist eine Konfigurationssache, kein kryptografisches Versprechen.
Build-Transparenz
Aktueller Build-Hash: 9358ba6
Der Build nutzt npm ci mit einem gepinnten Node-Image. Bitgenaue Reproduzierbarkeit
ist damit nicht garantiert, aber der Build-Hash erlaubt es, den genauen Quellstand zu prüfen:
Repository auf den Commit auschecken und den Code mit dem hier beschriebenen Verhalten abgleichen.
Quellcode
Das Repository ist AGPL-3.0 lizenziert. Security-Audits und Pull Requests sind willkommen.