← Übersicht

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.

Protokollablauf
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.