Ende-zu-Ende-verschlüsseltes Teilen in zeitkapsl

Eine der häufigsten Fragen, die wir hören, ist:

„Wenn Fotos Ende-zu-Ende verschlüsselt sind und nur mein Gerät sie entschlüsseln kann – wie kann ich sie dann mit anderen teilen?“

Gefolgt von:

„Wenn ich so einen Link erstellen kann, könnte zeitkapsl das dann nicht auch serverseitig tun?“

Sehr gute Fragen! Schauen wir uns an, wie das funktioniert.

Was ist E2EE?

👉 Kurz gesagt: Deine Fotos sind immer verschlüsselt, bevor sie dein Handy verlassen, und nur die Personen, die du auswählst, bekommen den Schlüssel, um sie zu öffnen.

Stell dir dein Fotoalbum wie ein Fotoalbum mit Vorhängeschloss vor:

  • Wenn du ein Foto zu zeitkapsl hochlädst, legt dein Handy es in das Album und verschließt es mit einem Schlüssel.
  • Dieser Schlüssel verlässt niemals deine Hand – nicht einmal zeitkapsl hat ihn.
  • Auf unseren Servern sehen wir nur das geschlossene, verschlossene Album.
  • Das Album reist sicher durchs Internet, immer noch verschlossen.
  • Dein Gerät (oder das deines Freundes) hat den Schlüssel und kann das Album öffnen und die Fotos anzeigen.
  • Ohne den Schlüssel ist das Album nur sinnloser, unlesbarer Datenmüll.

Deine Fotos bleiben verschlossen 🔒

Jedes Foto oder Video, das du hochlädst, wird verschlüsselt, bevor es dein Gerät verlässt. Jede Datei erhält ihren eigenen zufälligen Schlüssel, und nur deine Geräte können sie wieder entschlüsseln. Die Server von zeitkapsl sehen dein Passwort oder deine Schlüssel niemals im Klartext.

  • zeitkapsl kann niemals hineinschauen – nicht einmal aus Versehen.
  • Hacker oder Dritte sehen immer nur verschlüsselte Daten, niemals deine Fotos.
  • Teilen bleibt trotzdem möglich: Wenn du einen Freigabelink erstellst, übergibst du auch eine Kopie des Schlüssels (versteckt im Link). So kann das Gerät deines Freundes das Album öffnen – zeitkapsl jedoch weiterhin nicht.

Wenn du einen Link erstellst:

  1. Dein Gerät erzeugt ein neues Teilen-Passwort.
  2. Dieses Passwort verschlüsselt den Album-Schlüssel, der zum Öffnen der Fotos benötigt wird.
  3. Der Server speichert nur die verschlüsselte Version dieses Album-Schlüssels.

Der Link sieht dann so aus:

https://app.zeitkapsl.eu/s/123456789/#abcdef

  • 123456789 → ein Verweis auf unseren Server, z. B. mit Ablaufdatum oder Schreibrechten.
  • #abcdef... → das geheime Teilen-Passwort.

Der entscheidende Punkt: Alles nach dem # (dem „Fragment“) wird nie an den Server übertragen. Es existiert nur im Browser oder in der App deines Freundes.

Das bedeutet: Selbst wenn zeitkapsl die verschlüsselten Daten ausliefert, sehen wir niemals den Schlüssel, der sie entschlüsseln würde.


Zusammenfassung

  • Jedes Foto hat seinen eigenen Schlüssel.
  • Die Schlüssel sind ineinander verschachtelt: Passwort → Account-Key → Album-Key → Foto-Key.
  • Teilen funktioniert, indem der Album-Key mit einem Teilen-Passwort verschlüsselt wird, das im Link steckt.
  • Der geheime Teil des Links verlässt niemals deinen Browser.

Darum ist Teilen mit zeitkapsl privat, sicher und Ende-zu-Ende verschlüsselt.


Technischer Deep Dive

Dieser Abschnitt erklärt die kryptographischen Details hinter dem Ende-zu-Ende-verschlüsselten Teilen in zeitkapsl.

👉 Wenn du ASCII-Art bevorzugst: /keys.txt

Hier eine Übersicht aller verwendeten Schlüssel und Verfahren – mit etwas mehr Farben und Pixeln:


Medienverschlüsselung

Jede Mediendatei (Foto oder Video) wird mit einem eigenen mediaKey über AES-256-GCM verschlüsselt. Die verschlüsselte Version jedes Schlüssels wird auf dem Server für die Synchronisierung gespeichert. Wie man einen mediaKey entschlüsselt, wird in den folgenden Abschnitten beschrieben.


Registrierung

Bei der Registrierung:

  • Ein mainKey wird auf deinem Gerät erzeugt.

  • Er wird aus deinem Passwort mithilfe von PBKDF2 + HKDF abgeleitet und verschlüsselt auf dem Server gespeichert.

  • Verwende sha512(email) als salt und password als keyMaterial für PBKDF2.

  • Das Ergebnis ist der passwordKey.

  • Mit HKDF leiten wir daraus einen encryptionKey und ein authToken ab.

  • Der mainKey wird durch einen sicheren Zufallsgenerator erstellt.

    • Der mainKey muss auf Papier oder anderswo sicher aufbewahrt werden (siehe Passwort-Reset).
  • Mit HKDF leiten wir ein indexKey und ein passwordResetToken ab.

    • indexKey entschlüsselt alle collectionKey-Elemente.
      • collectionKey kann mediaKey entschlüsseln.
      • mediaKey entschlüsselt die eigentlichen Mediendateien und Metadaten.
    • passwordResetToken beweist den Besitz des mainKey und erlaubt einen Passwort-Reset.
    • Mit HKDF aus dem indexKey erhalten wir außerdem den searchLabelsKey.
  • Der mainKey wird dann mit dem encryptionKey über AES-GCM zu wrappedMainKey verpackt.

  • Das authToken wird per bcrypt auf dem Server gespeichert und dient als API-Passwort.

  • wrappedMainKey + email + passwordResetToken werden auf dem Server gespeichert.


Login

  • Nutzer gibt email und password ein.
  • PBKDF2 erzeugt den passwordKey.
  • Aus dem passwordKey leiten wir per HKDF ab:
    • encryptionKey
    • authToken
  • Mit dem authToken wird vom Server der wrappedMainKey abgerufen.
  • wrappedMainKey wird lokal mit dem encryptionKey (AES-GCM) entschlüsselt → Ergebnis: mainKey.

Passwort-Reset-Mechanismus

  • Bei der Registrierung bestätigt der Nutzer, dass er das Recovery Kit sicher aufbewahrt (enthält den mainKey in verschiedenen Repräsentationen).
  • Der Nutzer fordert einen Reset an, indem er aus dem wiederhergestellten mainKey das passwordResetToken erzeugt.
  • Der Server prüft das passwordResetToken und sendet einen Reset-Link an die hinterlegte E-Mail-Adresse.
  • Der Nutzer legt ein neues Passwort fest, das wieder zum Verschlüsseln des mainKey verwendet wird.
  • Ein neuer wrappedMainKey und ein neues authToken werden auf dem Server gespeichert.

Teilen eines Albums

Wenn du ein Album teilst:

  1. Dein Gerät generiert ein zufälliges Teilen-Passwort.
  2. Der collectionKey des Albums wird mit diesem Passwort per AES-256-GCM verschlüsselt.
  3. Der Server speichert nur den verschlüsselten collectionKey und die Metadaten (ID, Ablaufdatum, Berechtigungen).
  4. Der Link sieht dann so aus:

https://app.zeitkapsl.eu/s/123456789/#abcdef

  • 123456789 = Share-ID, um den verschlüsselten Album-Key nachzuschlagen.
  • #abcdef... = Teilen-Passwort, nur dem Client bekannt.

Das URL-Fragment

Das Teilen-Passwort steckt im Fragment (alles nach dem #).

Laut HTTP-Standard (RFC 3986, Abschnitt 3.5):

„Der Fragment-Identifier wird nicht im scheme-spezifischen Teil einer URI verwendet; er wird vor einer Anfrage abgetrennt und niemals an den Server gesendet.“

Das garantiert, dass zeitkapsl das Teilen-Passwort niemals erfährt.


Entschlüsselungsfluss beim Empfänger

Teilen-Passwort (aus #fragment)

PBKDF2

Share Key

HKDF

authKey (BCRYPT) + indexKey (AES-GCM-256)

Collection Key

Media Keys

Dateien werden lokal entschlüsselt

Der gesamte Prozess läuft lokal auf dem Gerät des Empfängers ab. Unsere Server liefern ausschließlich verschlüsselte Datenblobs.


Zusammenfassung

  • Alle Mediendateien werden mit eigenen Schlüsseln (AES-256-GCM) verschlüsselt.
  • email + password → PBKDF2 → HKDF → authToken + encryptionKey → mainKey → indexKey + resetToken → collectionKey → mediaKey
  • Shares umhüllen den Album-Key mit einem zusätzlichen Passwort.
  • Das Teilen-Passwort befindet sich ausschließlich im URL-Fragment (#...), das nie an den Server gesendet wird (RFC 3986 §3.5).
  • Daher kann zeitkapsl keine Links erstellen, öffnen oder missbrauchen.

Häufige Fragen

F: Kann zeitkapsl meine Fotos sehen? Nein. Alle Medien, Alben und Metadaten werden auf deinem Gerät verschlüsselt, bevor sie hochgeladen werden. Ohne dein Passwort oder Recovery Kit können selbst wir sie nicht öffnen.

F: Was passiert, wenn ich mein Passwort verliere? Du benötigst dein Recovery Kit (enthält den mainKey). Damit kannst du dein Passwort zurücksetzen. Ohne Recovery Kit sind deine Daten kryptographisch unwiederbringlich verloren.

F: Kann zeitkapsl Freigabelinks erstellen oder öffnen? Nein. Das geheime Teilen-Passwort steckt im #fragment des Links. Laut Standard (RFC 3986 §3.5) wird dieser Teil niemals an den Server gesendet. Nur das Gerät des Empfängers kann ihn nutzen, um die Daten zu entschlüsseln.