Sicherheit · Im Detail

Der kryptografische Lebenszyklus

Ein genauer Rundgang durch alles, was in jedem Schritt mit deinen Daten passiert, mit Primitiven, Parametern und Vertrauensgrenzen. Jeder Schritt beginnt mit einer Zusammenfassung in einfachen Worten, sodass du so tief lesen kannst, wie du möchtest.

Schritt 01 · Verschlüsseln

Dein Geheimnis wird auf deinem Gerät versiegelt

Einfach gesagt: Die Verschlüsselung passiert in deinem Browser, bevor irgendetwas hochgeladen wird. Was bei uns ankommt, ist schon unlesbar.

Wenn du auf Verschlüsseln drückst, zieht der Browser einen frischen 256-Bit-Inhaltsschlüssel aus dem WebCrypto CSPRNG und verschlüsselt deine Daten mit AES-256-GCM. GCM ist authentifiziert: Jeder Block trägt ein 128-Bit-Tag, sodass jede spätere Manipulation erkannt wird, statt stillschweigend entschlüsselt zu werden.

Text und Dateien werden gleich behandelt: Beides wird zu einem undurchsichtigen Binär-Blob, aufgefüllt auf eine Standardgröße, sodass ein kurzes Passwort und eine kleine Datei gleich aussehen. Der Klartext berührt nie das Netzwerk und verlässt nie den Speicher des Tabs.

ChiffreAES-256-GCM, Blöcke à 64 KiB
Inhaltsschlüssel256 Bit, neu für jedes Geheimnis
Nonce7 Byte zufälliges Präfix + Zähler
Auth-Tag128 Bit pro Block
AuffüllungPadmé, mindestens 64 KiB

Schritt 02 · Schlüsselverwahrung

Der Schlüssel steckt im Link, nicht auf unseren Servern

Einfach gesagt: Der Teil des Links nach dem # enthält den Schlüssel, und Browser senden diesen Teil nie an einen Server.

Dein Link trägt einen zufälligen 256-Bit-Seed im URL-Fragment, also in allem nach dem #. Laut URL-Spezifikation entfernt der Browser das Fragment, und es ist nie Teil der Anfrage an unsere Server. Aus diesem Seed leitet der Browser mit HKDF einen Suchwert ab, mit dem das Geheimnis gefunden wird, sowie den Schlüssel, der den Inhaltsschlüssel entpackt. Der Server sieht immer nur einen Hash des Suchwerts.

Der Browser der empfangenden Person liest den Seed aus dem Fragment und führt dieselbe Ableitung lokal durch. Das ist hier mit „Zero-Knowledge“ gemeint: Wer nur den Chiffretext besitzt, kann ohne den Link nichts damit anfangen.

Ort des SchlüsselsURL-Fragment #
An den Server gesendet?nie
Seed32 zufällige Bytes, base64url
AbleitungHKDF-SHA-256
Server speichertnur SHA-256(Suchwert)

Schritt 03 · Optionale Passphrase

Ein zweites Schloss, das nur Menschen öffnen

Einfach gesagt: Mit einer Passphrase kann selbst jemand mit dem vollständigen Link das Geheimnis ohne sie nicht öffnen.

Wenn du eine Passphrase festlegst, wird sie mit Argon2id gestreckt, einer speicherintensiven Schlüsselableitungsfunktion, und mit dem Seed zu dem Schlüssel kombiniert, der den Inhaltsschlüssel einpackt. Die Passphrase selbst wird nie übertragen oder gespeichert; nur du und die empfangende Person kennen sie. Falsche Versuche werden im Browser der empfangenden Person gegen Daten wiederholt, die er bereits hat, sodass der Server sie nicht zählen kann.

Die Speicherintensität macht massenhaftes Offline-Raten selbst auf GPUs und ASICs teuer. Teile die Passphrase über einen anderen Kanal als den Link, dann treffen die beiden Faktoren nie an einem Ort zusammen. Das Argon2-Modul wird bei jedem Erstellen und Anzeigen geladen, sodass im Netzwerk nicht erkennbar ist, welche Geheimnisse eine Passphrase nutzen.

KDFArgon2id
Salt128 Bit, zufällig
EinpackenAES-256-GCM, 96-Bit-IV

Schritt 04 · Übertragung & Speicherung

Nur Chiffretext verlässt dein Gerät

Einfach gesagt: Wir speichern eine verschlossene Kiste und einen Ablaufzeitpunkt. Sonst nichts: kein Klartext, kein Schlüssel, keine Spur von dir.

Der Blob wird über TLS hochgeladen und als Chiffretext gespeichert, zusammen mit gehashten Zugangsdaten, seiner Lebensdauer und einem gerundeten Ablaufzeitpunkt. Wir speichern bewusst keine Identität der sendenden Person, keine Empfänger, kein IP-Protokoll, keinen Erstellungszeitpunkt und keinen Zugriffsverlauf. Es gibt kein Kontosystem, das ein Geheimnis mit einer Person verknüpfen könnte. Das Ratenlimit arbeitet mit einem HMAC der Adresse unter einem wechselnden Salt, sodass sich nichts von vor einem Wechsel mit etwas danach verknüpfen lässt.

Weil das gespeicherte Objekt ohne den Seed im Fragment bedeutungslos ist, bringen ein kompromittierter Server oder eine behördliche Anordnung nur undurchsichtige Bytes und Hashes zutage, aus denen sich nichts zurückgewinnen lässt.

Bei der ÜbertragungTLS
Im RuhezustandChiffretext + gehashte Schlüssel + Ablaufzeit
Protokollekeine pro Geheimnis

Schritt 05 · Abruf & Zerstörung

Wer zuerst liest, gewinnt – dann wird gelöscht

Einfach gesagt: Ein Einmal-Link gibt die Kiste einmal heraus und löscht die Kopie auf dem Server. Oder du zerstörst sie selbst, jederzeit.

Beim Laden der Anzeigeseite wird nichts abgerufen: Die Anfrage geht erst bei einem echten Klick oder Tastendruck hinaus, sodass Link-Scanner und Chat-Vorschauen kein Geheimnis verbrauchen können. Bei einem Einmal-Geheimnis beansprucht der Server die Zeile in einem einzigen bedingten Update – genau eine Anfrage gewinnt –, und ab diesem Moment gilt das Geheimnis als verbraucht. Derselbe Browser kann 15 Minuten lang erneut herunterladen, falls die Verbindung abbricht; niemand sonst kann das, und eine unbestätigte Beanspruchung wird zerstört, nie rückgängig gemacht. Befristete Geheimnisse werden bis zum Ablauf einfach gelesen.

Jedes Geheimnis hat außerdem einen privaten Brenn-Link. Ihn zu öffnen zerstört für sich noch nichts; erst die Bestätigung löscht den Chiffretext sofort, bevor eine empfangende Person ihn lesen kann.

Einmalige Ansichtatomare Beanspruchung, dann zerstört
Zeitfenster für erneuten Download15 Min., nur derselbe Client
Ablaufzeit15 Min. – 14 Tage
Kontrolle für dichBrenn-Link

Bedrohungsmodell

Was shhnote sehen kann und was nicht

Die ehrliche Fassung. Hier steht genau, wo die Vertrauensgrenze verläuft.

Verlässt nie dein Gerät

Was wir nicht sehen können

Dein Klartext · der Inhaltsschlüssel und der Seed · deine Passphrase · ob eine Passphrase gesetzt wurde · wer ein Geheimnis erstellt oder geöffnet hat · wann es erstellt wurde · Zugriffsprotokolle auf IP-Ebene. Nichts davon wird übertragen oder aufbewahrt.

Auf unseren Servern gespeichert

Was wir tatsächlich haben

Einen verschlüsselten Blob, den wir nicht öffnen können · seine aufgefüllte Größenklasse · Einweg-Hashes der Werte, mit denen dein Browser es findet oder brennt · ob es eine einmalige Ansicht ist oder befristet · einen gerundeten Ablaufzeitpunkt. Alles nutzlos ohne den Seed in deinem Link.

Gut zu wissen

Die ehrlichen Einschränkungen

Wer den vollständigen Link hat (und die Passphrase, falls gesetzt), kann ein Einmal-Geheimnis lesen: Behandle den Link wie das Geheimnis selbst. Nachdem ein Geheimnis angezeigt wurde, überschreibt die Seite beim Verlassen, was sie kann, aber JavaScript kann das nicht garantieren; schließ den Tab, wenn du fertig bist. Ein automatisierter Browser, der echte Eingaben erzeugt, kann ein Einmal-Geheimnis öffnen, wie es ein Mensch täte – die empfangende Person findet dann nichts, und das ist das ehrliche Ergebnis. Löschen entfernt den Eintrag; verschlüsselte Reste können in Journalen, freiem Speicherplatz oder Backups verbleiben, bis sie überschrieben werden, als Chiffretext ohne Schlüssel. Große Geheimnisse, die außerhalb der Datenbank liegen, tragen den Zeitpunkt, zu dem die Datei geschrieben wurde. Und wie bei jeder Web-App vertraust du dem Code, der an deinen Browser ausgeliefert wird – deshalb ist shhnote Open Source und lässt sich selbst betreiben.

Kryptografische Spezifikation

Jedes Primitiv an einem Ort

Verschlüsselung

AES-256-GCM

Authentifizierte symmetrische Verschlüsselung in Blöcken à 64 KiB. Ein 256-Bit-Schlüssel plus ein Integritäts-Tag pro Block, sodass Manipulation oder Abschneiden erkannt wird, statt nur unlesbar zu bleiben.

Schlüsselableitung

HKDF · Argon2id

Schlüssel und Kennungen werden über HKDF-SHA-256 aus dem Seed gewonnen. Optionale Passphrasen werden mit einer speicherintensiven KDF gestreckt. Das macht Offline-Brute-Force-Angriffe langsam und teuer, selbst auf Spezialhardware.

Zufall

WebCrypto CSPRNG

Seeds, Schlüssel, Salts und Nonces stammen aus dem kryptografisch sicheren Zufallsgenerator des Browsers. Nie Math.random(), nie vorhersagbar.

Schlüsselverwahrung

URL-Fragment #

Der Seed steht in deinem Link nach dem #. Browser übertragen das Fragment nie, also erreicht er nie unsere Server.

Bei der Übertragung

TLS

Nur Chiffretext verlässt dein Gerät, über modernes TLS. Was bei uns ankommt, ist ein undurchsichtiger Blob, den wir nicht öffnen können.

Im Ruhezustand

Chiffretext + Hashes

Wir speichern einen verschlüsselten Blob, Einweg-Hashes seiner Zugangsdaten und einen gerundeten Ablaufzeitpunkt – keinen Klartext, keine Schlüssel, keine Metadaten über Absender oder Empfänger.

Technische FAQ

Für Sicherheitsbewusste

Wie wird die einmalige Ansicht gegen gleichzeitige Zugriffe abgesichert?

Beim Anzeigen läuft ein einziges bedingtes Update, das die Zeile von „aktiv“ auf „beansprucht“ setzt. Zwei gleichzeitige Anfragen können nicht beide erfolgreich sein; die zweite trifft auf einen bereits beanspruchten Eintrag und bekommt dieselbe Antwort „kein Geheimnis gefunden“ wie alle anderen. Die Beanspruchung wird nie rückgängig gemacht: Geht der Download verloren, lädt der Inhaber des Claim-Tokens innerhalb des Zeitfensters erneut herunter, andernfalls wird das Geheimnis ungelesen zerstört.

Warum das URL-Fragment statt eines Query-Parameters?

Query-Parameter werden an den Server gesendet und landen in Zugriffsprotokollen, Proxys und Analysetools. Das Fragment (nach dem #) bleibt laut URL-Spezifikation auf der Client-Seite: Der Browser nimmt es nie in die HTTP-Anfrage auf. Auf dieser Eigenschaft beruht das gesamte Zero-Knowledge-Design. Nach dem Anzeigen entfernt die Seite das Fragment außerdem aus Adressleiste und Verlauf.

Was hindert Link-Scanner daran, Einmal-Geheimnisse vorzeitig zu verbrennen?

Die Anzeigeseite ist für jedes Geheimnis dasselbe statische Dokument und lädt beim Aufruf nichts. Die Anfrage wird erst bei einem echten Klick oder Tastendruck gesendet; ein per Skript ausgelöstes click() oder Absenden eines Formulars zählt nicht. Automatische Scanner (E-Mail-Sicherheit, Linkvorschauen in Chats, Virenscanner) laden immer nur diese statische Hülle.

Kann ich das überprüfen oder selbst betreiben?

Ja. Der gesamte Quellcode ist unter AGPLv3 öffentlich, das Protokoll ist in einer Spezifikation festgehalten, mit Konformitätsvektoren, an denen sich jede Implementierung selbst prüfen kann, und es gibt eine Anleitung zum Selbstbetrieb. Du kannst die clientseitige Kryptografie prüfen und eine eigene Instanz betreiben, sodass die Vertrauensgrenze ganz bei dir liegt.

Wird zur Missbrauchsabwehr etwas protokolliert?

Wir führen keine Zugriffsprotokolle pro Geheimnis und keinen IP-Verlauf. Das Ratenlimit nutzt einen schlüsselbasierten Hash der Adresse mit einem Salt, das regelmäßig wechselt und dabei jeden Zähler mit löscht. Missbrauchsmeldungen werden pro Tag gezählt; welches Geheimnis gemeldet wurde, wird nicht festgehalten.

Tipps zum sicheren Teilen

  • Schick die Passphrase auf einem anderen Weg als den Link, zum Beispiel den Link per E-Mail und die Passphrase am Telefon.
  • Wähle die kürzeste Ablaufzeit, die für dich passt.
  • Nutze ein Einmal-Geheimnis für Passwörter und andere Informationen, die genau einmal gelesen werden sollen.

Sicherheitslücke melden

Wenn du glaubst, ein Sicherheitsproblem mit dieser Website gefunden zu haben, schreib bitte an [email protected] und informiere uns vertraulich, bevor du es anderen erzählst. Beschreibe, was du gefunden hast und wie es sich nachvollziehen lässt.

Wir werden:

  • innerhalb von 5 Werktagen antworten;
  • dich auf dem Laufenden halten, während wir es beheben;
  • dich bei der Veröffentlichung der Lösung nennen, wenn du möchtest.

Bitte greif beim Testen nicht auf Daten anderer zu, stör den Dienst nicht und führ keine automatischen Scans durch, die ihn stark belasten.

Sicherheitslücken in der shhnote-Software selbst: siehe die Sicherheitsrichtlinie des Projekts.

Geheimnis erstellen Quellcode auf GitHub ansehen

Probier es aus, es dauert zehn Sekunden

Schreib etwas Geheimes, hol dir deinen Einmal-Link und sieh zu, wie es verschwindet.

Geheimnis erstellen