Sicherheit · Protokoll v0.7.1 · noch nicht extern geprüft

So funktioniert die Verschlüsselung

Alles wird auf dem Handy verschlossen, bevor es das Gerät verlässt. Unser Server ist ein Briefkasten für verschlossene Umschläge, und die andere Person leiht sich die Schlüssel zu deinen Antworten nur aus.

Diese Seite zeigt Schritt für Schritt, was im Hintergrund passiert. Die kurze Fassung steht auf der Seite Sicherheit, die vollständige im Protokoll und im Bedrohungsmodell (beide auf Englisch). Maßgeblich ist das Protokoll.

Robin und Kim sind ein ausgedachtes Paar. Robin ist in der Akzentfarbe gezeichnet, Kim in der Textfarbe, der Server gestrichelt, Schlüssel kräftiger getönt.

  • Verschlossen, bevor es rausgehtFragen, Antworten, Kommentare und Namen werden auf dem Handy verschlüsselt. Schlüssel haben nur eure beiden Handys.
  • Antworten öffnen sich gemeinsamEin Torschlüssel liegt beim Server und wird erst frei, wenn beide geantwortet haben.
  • Schlüssel sind geliehenDie Kopie deines Antwortschlüssels auf dem anderen Handy läuft nach 7 Tagen ab, wenn sie nicht erneuert wird.

Der Überblick

Lesbaren Text gibt es nur auf euren Handys. Dazwischen liegen nur verschlossene Umschläge.

Robins Handy Klartext gibt es nur hier 12-Wörter-Wiederherstellungscode Schlüssel im Geräte-Schlüsselbund verschlüsselte lokale Datenbank verschließt alles vor dem Senden Unser Server (EU) Speichert verschlossene Umschläge öffentliche Schlüssel, Torschlüssel verschlossene Leihschlüssel wer mit wem verbunden ist hat keinen Schlüssel zu Inhalten Kims Handy Klartext gibt es nur hier eigener 12-Wörter-Code Schlüssel im Geräte-Schlüsselbund verschlüsselte lokale Datenbank öffnet erst nach Signaturprüfung hochladen abgleichen abgleichen hochladen Weckruf Push von Apple / Google sieht eine versiegelte 304-Byte-Notiz versiegelte Notiz
Durch die gestrichelten Kästen geht nie etwas Lesbares. TLS schützt zusätzlich die Verbindung, aber selbst wer im Server steckt, findet nur verschlossene Umschläge.

Alle Schlüssel wachsen aus 12 Wörtern

Beim ersten Start erzeugt das Handy 128 Zufallsbits und zeigt sie als 12 englische Wörter an (BIP-39). Alle persönlichen Schlüssel werden daraus abgeleitet (HKDF-SHA256). Deshalb holen die Wörter allein ein Konto auf ein neues Handy zurück. Sie werden nirgendwohin gesendet.

12 Wörter 128 Zufallsbits ableiten Hauptgeheimnis Konto-ID Zufallszahl, kein Name, keine Mail Anmeldeschlüssel zeigt dem Server, dass du es bist Signaturschlüssel versiegelt jeden Eintrag Empfangsschlüssel damit nur du Geschicktes öffnest Privater Inhaltsschlüssel für private Fragen und Notizen
Dieselben 12 Wörter ergeben immer dieselben Schlüssel. Nach einer Wiederherstellung muss das andere Handy nichts tun. Auf dem Server liegen nur die öffentlichen Hälften von Signatur- und Empfangsschlüssel.

Beide behalten ihn

Paar-Fragenschlüssel

Verschließt geteilte Fragen, Anzeigenamen und „besprochen“-Markierungen. Er wird nie zurückgenommen, deshalb überstehen geteilte Fragen eine Trennung.

Deiner, nur verliehen

Antwortschlüssel

Einer pro Person. Er öffnet deine Antworten und Kommentare. Die andere Person bekommt nur eine Leihgabe, die ohne Erneuerung nach 7 Tagen abläuft.

Neu für jeden Eintrag

Eintragsschlüssel

Verschlüsselt genau eine Antwort oder einen Kommentar und ist selbst mit dem Antwortschlüssel verschlossen. Ein neuer Antwortschlüssel verschließt nur diese kleinen Schlüssel neu, nie den Text.

Zwei Handys verbinden

Robin lädt Kim mit einem QR-Code oder Link ein. Der geheime Teil steht hinter dem # im Link, und den schicken Browser nie an einen Server. Damit können sich beide Handys gegenseitig beweisen, dass der Server keine fremden Schlüssel untergeschoben hat.

Robin Server Kim erzeugt Einladungs-ID + Geheimnis Einladungs-ID + Hash (ohne Geheimnis) QR-Code oder Link: Geheimnis + Robins Fingerabdruck hinter dem # Einlöse-Token + Beweis mit dem Geheimnis Robins öffentliche Schlüssel vergleicht sie mit dem Fingerabdruck Kims öffentliche Schlüssel + Beweis prüft den Beweis: nichts vertauscht Paar-Fragenschlüssel, nur für Kim weitergereicht, Server kann nicht öffnen Beide bestätigen, auf Wunsch nach dem Vergleich eurer Sicherheitscodes. Die Verbindung steht.
Danach schickt jedes Handy dem anderen eine Leihgabe seines Antwortschlüssels, verschlossen mit dem Empfangsschlüssel der anderen Person (HPKE). Ab jetzt merken sich beide Handys die Schlüssel der anderen Seite und warnen, falls der Server je andere zeigt. Die Sicherheitscodes schützen, wenn der Link über einen kompromittierten Messenger verschickt wurde.

Eine Frage teilen

Jede Frage beginnt privat. Beim Teilen entsteht eine Kopie für euren gemeinsamen Bereich, die private Notiz bleibt zurück.

Private Frage verschlossen mit Robins privatem Inhaltsschlüssel mit privater Notiz Teilen Geteilte Kopie Notiz bleibt privat auf feste Größe aufgefüllt Paarschlüssel + Signatur hochladen Paarbereich bewahrt den Umschlag öffnet ein Tor für Antworten sieht nur Größe und Zeit abgleichen Kims Handy prüft die Signatur öffnet mit dem Paar-Fragenschlüssel Ein Umschlag, so wie der Server ihn sieht Kopf: Version, ID, Bereich, Autor:in Verschlossener Inhalt, aufgefüllt auf 1, 4, 16 oder 64 KiB Signatur
Durch das Auffüllen sieht eine Frage aus zwei Wörtern für den Server genauso groß aus wie eine lange. Dank der Signatur (Ed25519) verwirft Kims Handy alles, was der Server verändert hat.

Antworten öffnen sich erst, wenn beide geantwortet haben

Eine Antwort bekommt ein zusätzliches Schloss, den Torschlüssel. Das Handy lädt zuerst die Antwort hoch und gibt dann den Torschlüssel beim Server ab. Der Server gibt ihn erst weiter, wenn die andere Person ebenfalls eine Antwort abgegeben hat.

Torschlüssel Server gibt ihn erst frei, wenn beide geantwortet haben Robins Antwortschlüssel Kim hat ihn nur als 7-Tage-Leihgabe Eintragsschlüssel neu für jede Antwort Robins Antworttext Noch niemand Tor entsteht, wenn die Frage geteilt wird. Robin hat geantwortet Server behält Robins Torschlüssel. Kim sieht nur, dass Robin geantwortet hat. Beide haben geantwortet Server gibt jeden Torschlüssel an die andere Person. Beide können lesen. Der Server allein hat keinen Antwortschlüssel. Kim allein hat keinen Torschlüssel.
Um Robins Antwort zu lesen, öffnet Kims Handy die Schlösser von außen nach innen: Torschlüssel, dann den geliehenen Antwortschlüssel, dann den Eintragsschlüssel. Wer als zweites antwortet, löst die Freigabe aus, auch wenn das andere Handy offline ist. Wer nach dem Lesen erneut antwortet, wird der anderen Person angezeigt.

Leihschlüssel, Zurückziehen und Trennen

Kims Handy erneuert bei jedem Abgleich die Leihgabe von Robins Antwortschlüssel. Robins Handy unterschreibt die Leihgabe dafür jeden Tag neu, mit Datum. Ist die Leihgabe weg, vergehen 7 Tage ohne Erneuerung oder ist Robins Unterschrift älter als 30 Tage, löscht das Handy den Schlüssel und jede Antwort, die davon abhängt. Eine einzelne Antwort zurückzuziehen funktioniert genauso: Robin wechselt zu einem neuen Antwortschlüssel, und der alte läuft ab.

Robin tippt auf „Trennen“ Server löscht alle Leihgaben Kims Handy, online Robins Antworten beim nächsten Abgleich gelöscht Kims Handy, offline seit Tag 1 Leihgabe abgelaufen, Antworten weg Geteilte Fragen (Paar-Fragenschlüssel) nie zurückgenommen, bleiben für beide lesbar 012345678910 Tage
Punkte sind Abgleiche, die die Leihgabe erneuert haben. Robins Handy zeigt ehrlich an, wie es um Kims Handy steht: „Löschung bestätigt“, sobald es abgeglichen hat, sonst „spätestens ab Tag 8 unlesbar“. Die Zeit kommt von der signierten Server-Uhr, deshalb verlängert eine verstellte Handy-Uhr keine Leihgabe. Eine Trennung rückgängig machen geht nur zu zweit. Nach 365 Tagen löst sich die Verbindung auf, und jede Person behält die Fragen privat, mit der eigenen Antwort als Notiz.

Benachrichtigungen ohne Inhalt

Nur vier Ereignisse lösen sofort einen Push aus: eine neu geteilte Frage, beide Antworten freigegeben, ein neuer Kommentar und eine Trennung. Das sendende Handy versiegelt die Notiz selbst, deshalb erfahren weder unser Server noch Apple oder Google auch nur die Art.

Robins Handy Art + Eintrags-ID, aufgefüllt, versiegelt für Kims Push-Schlüssel Unser Server reicht den Block unverändert weiter Apple / Google sehen 304 Bytes und einen neutralen Ersatztext Kims Handy öffnet die Notiz auf dem Gerät Angezeigt „Robin hat eine Frage geteilt“ nie der Fragetext Nur auf dem Handy: Erinnerung nach 7 Tagen, „Vor einem Jahr“-Rückblick und Hinweise vor dem Auflösen der Verbindung.
Jede Push-Art lässt sich abschalten; das Handy schickt sie dann einfach nicht. Während einer Trennung werden keine Pushes verschickt.

Die Bausteine

Keines dieser Verfahren ist selbst erfunden. Der Kern der App ist in Rust geschrieben und nutzt gepflegte, viel geprüfte Bibliotheken.

WofürVerfahren
Inhalte verschlüsselnXChaCha20-Poly1305
Einen Schlüssel für eine andere Person verschließenHPKE (RFC 9180) mit X25519
SignaturenEd25519
Schlüssel ableitenHKDF-SHA256
Wiederherstellungs-CodeBIP-39-Wortliste, 12 Wörter, 128 Bit
Größe verbergenAuffüllen auf 1, 4, 16 oder 64 KiB

Was Verschlüsselung nicht leisten kann

  • Eine veränderte App oder ein manipuliertes Handy kann alles behalten, was es je lesen konnte. Screenshots und Fotos lassen sich nicht verhindern.
  • Ein Handy, das offline bleibt, kann zurückgezogene oder getrennte Inhalte noch bis zu 7 Tage lesen. Würde jemand unseren Server übernehmen und alte Leihgaben weiter ausliefern, wären es höchstens 30 Tage.
  • Der Server könnte zusammen mit der anderen Person eine Antwort vorzeitig öffnen.
  • Mit einer veränderten App könnte die andere Person eine sinnlose Antwort abgeben, um deine freizuschalten. Eine erneute Antwort danach wird dir angezeigt.
  • Wer Handy und 12 Wörter verliert, verliert die eigenen Inhalte.
  • Eine Prüfung von außen gab es bisher nicht.

Was der Server trotzdem erfährt und wie du eine Sicherheitslücke meldest, steht auf der Seite Sicherheit.