cinderpaste

So funktioniert cinderpaste

cinderpaste verschlüsselt im Browser, sodass der Server deinen Klartext nie sieht. Hier ist die ganze Reise eines Pastes — vom Tippen bis zum Lesen — in vier Schritten.

  1. 1. Text eingeben

    Du schreibst oder fügst dein Geheimnis in den Editor ein. Noch wurde nichts irgendwohin gesendet — alles bleibt in deinem Browser-Tab.

  2. 2. Ablaufzeit wählen

    Wähle, wie lange der Paste leben soll und ob er nach dem Lesen verbrennen soll. Optional setzt du eine Passphrase als zweiten Faktor.

  3. 3. Link teilen

    Dein Browser verschlüsselt den Text und lädt nur den Chiffretext hoch. Du erhältst einen Link, dessen Entschlüsselungsschlüssel im URL-Fragment nach dem #-Zeichen steckt.

  4. 4. Empfänger entschlüsselt

    Öffnet jemand den Link, liest der Browser den Schlüssel aus dem Fragment und entschlüsselt den Paste lokal. Der Server berührt den Schlüssel nie.

Unter der Haube

Verschlüsselt wird mit AES-256-GCM über die Web Crypto API — eine schnelle, authentifizierte Chiffre, die in jedem modernen Browser eingebaut ist, sodass keine Krypto-Bibliothek von Dritten nötig ist.

Bei Passwort-Pastes wird der Schlüssel mit PBKDF2-SHA256 über 600.000 Iterationen und einem zufälligen 16-Byte-Salt abgeleitet, was das Durchprobieren einer schwachen Passphrase teuer macht.

Der Clou ist das URL-Fragment. Alles nach dem # in einem Link sendet der Browser nie an den Server. Genau dort bewahrt cinderpaste den Schlüssel auf — er reist mit dem Link, erreicht uns aber nie.

Beispiel zur Veranschaulichung

// Illustrative — runs entirely in the recipient's browser
const key = keyFromUrlFragment(location.hash);   // never sent to the server
const { ciphertext, iv } = await fetch(pasteUrl).then(r => r.json());

const plaintext = await crypto.subtle.decrypt(
  { name: "AES-GCM", iv },
  key,
  ciphertext,
);

Eine vereinfachte Skizze dessen, was dein Browser tut — nicht die exakte Implementierung.