Sicherheit
Ein Vertrauensmodell, das erklärt wird, lässt sich prüfen; eines, das versteckt wird, nicht. Das macht SecureChat – und auch, was es nicht macht.
Kurz gesagt
- Nachrichten werden zwischen deinem Handy und dem Server des Unternehmens Ende-zu-Ende verschlüsselt. Wir transportieren nur verschlüsselten Text.
- Wir erzeugen oder sehen niemals private Schlüssel: Deiner entsteht auf deinem Handy, der des Unternehmens in dessen Infrastruktur.
- Wir verifizieren Unternehmen und signieren ihren öffentlichen Schlüssel; die App warnt dich, wenn sich dieser Schlüssel ändert.
- Die Verschlüsselung endet im Backend des Unternehmens: Was es mit dem entschlüsselten Text macht, liegt außerhalb unserer Kontrolle.
- Die aktuelle Version des Protokolls bietet keine Forward Secrecy.
- Wir sind das Schlüsselverzeichnis für beide Seiten: Ohne den zusätzlichen Schutz des Links könnte ein aktiver böswilliger Betreiber (wir) beim ersten Kontakt einen Schlüssel austauschen.
Wie eine Nachricht verschlüsselt wird (Umschlag v1)
Wir verwenden libsodium, eine geprüfte und weit verbreitete Kryptografie-Bibliothek. Das sind die Bausteine des Umschlags v1 (sc1):
| Baustein | Umsetzung |
|---|---|
| Identität (dein Gerät und das Unternehmen) | X25519-Schlüsselpaar |
| Schlüssel der Unterhaltung | 32 zufällige Bytes, von deinem Handy erzeugt, wenn du die Einladung einlöst. Würden wir ihn erzeugen, würden wir ihn kennen. |
| Verteilung dieses Schlüssels | Er wird getrennt für deinen öffentlichen Schlüssel und für den des Unternehmens versiegelt (crypto_box_seal). Wir speichern nur die beiden versiegelten Umschläge. |
| Verschlüsselung jeder Nachricht | XChaCha20-Poly1305 mit zufälliger 24-Byte-Nonce |
| Zugehörige Daten | Jede Nachricht ist an ihre Unterhaltung, ihren Absender, ihre Kennung und die Schlüsselversion gebunden. Ein Server kann sie weder in eine andere Unterhaltung verschieben noch unter einer anderen Kennung duplizieren oder eine deiner Nachrichten als Nachricht des Unternehmens ausgeben. |
| Padding | Auf Vielfache von 256 Bytes, um die genaue Länge zu verbergen |
| Signatur des Unternehmensschlüssels | Ed25519, mit dem Plattformschlüssel |
| Signatur der Schlüsselrotation | Ed25519, mit dem eigenen Signaturschlüssel des Unternehmens (siehe unten) |
| Fingerabdrücke | BLAKE2b-256 mit Domänentrennung |
Verschlüsselte Anhänge
Fotos und Dokumente werden auf dem Gerät verschlüsselt, das sie sendet (dein Handy oder der Server des Unternehmens), genau wie Text:
- Jede Datei hat einen eigenen Schlüssel aus 32 zufälligen Bytes, der sich vom Schlüssel der Unterhaltung unterscheidet.
- Sie wird in Blöcken zu 64 KiB mit XChaCha20-Poly1305 verschlüsselt. Jeder Block wird zusammen mit der Kennung des Anhangs, seiner Position und der Angabe, ob er der letzte ist, authentifiziert: Wer Blöcke umsortiert, abschneidet oder hinzufügt, bringt die Entschlüsselung zum Scheitern.
- Der Dateischlüssel, Name, Typ, Größe und Fingerabdruck (BLAKE2b) reisen in einer normalen verschlüsselten Nachricht. Am Ende prüft die App den Fingerabdruck; stimmt etwas nicht, zeigt sie „Dieser Anhang konnte nicht entschlüsselt werden“ und nie eine unvollständige Datei.
- Wir speichern nur undurchsichtige Bytes und eine Kennung. Wir sehen die Größe der verschlüsselten Datei, die praktisch der des Originals entspricht: Anhänge werden nicht wie Nachrichten aufgefüllt. Nur die beiden Enden der Unterhaltung können sie hoch- und herunterladen, über temporäre Links, die 5 Minuten gültig sind.
- Maximal 25 MB pro Datei. Wir erzeugen keine Vorschaubilder (das können wir nicht: Wir sehen den Inhalt nicht); die App erstellt die Vorschau nach dem Entschlüsseln.
Was geschützt ist
- Ein Datenleck unserer Datenbank oder unserer Backups: Sie enthalten nur verschlüsselten Text.
- Neugierige Mitarbeitende mit Zugriff auf die Server.
- Passive Angreifer im Netzwerk oder alle, die den Datenverkehr abfangen.
- Push-Benachrichtigungen: Sie enthalten den Inhalt nicht, daher sehen ihn weder Apple noch Google.
- Manipulation von Nachrichten während der Übertragung oder auf unseren Servern: Die Entschlüsselung schlägt fehl, statt einen veränderten Text anzuzeigen.
Was nicht geschützt ist
- Das andere Ende ist das Backend des Unternehmens. Dort wird die Nachricht entschlüsselt. Leitet das Unternehmen sie unverschlüsselt an ein Cloud-Helpdesk oder -CRM weiter, kann dieser Anbieter sie sehen. Wenn du in einer regulierten Branche arbeitest, frag das Unternehmen, wo der Text landet.
- Wir, wenn wir aktiv handeln. Deine App erhält den Schlüssel des Unternehmens von unserem Server, und das Unternehmen erhält deinen ebenfalls von uns. Ein böswilliger Betreiber könnte jeden der beiden austauschen. Die App pinnt den Schlüssel des Unternehmens beim ersten Kontakt und warnt, wenn er sich ändert, aber genau dieser erste Kontakt ist dadurch nicht geschützt. Der Fingerabdruck im Link (siehe unten) schließt diese Lücke, wenn die Einladung als mit dem SDK erzeugter Link ankommt.
- Ein kompromittiertes Gerät. Wer dein Handy oder den Server des Unternehmens kontrolliert, kann die Nachrichten dort lesen.
- Die Metadaten. Wir erklären sie weiter unten.
Plattformschlüssel und Verifizierung von Unternehmen
Bevor ein Unternehmen einladen kann, prüfen wir, ob es rechtlich existiert, ob es seine Domain (DNS-Eintrag) kontrolliert und die WhatsApp-Nummer, von der aus es einlädt. Danach signieren wir seinen öffentlichen Schlüssel mit unserem Ed25519-Plattformschlüssel. Die App prüft diese Signatur und zeigt das Abzeichen Verifiziertes Unternehmen.
Öffentlicher Plattformschlüssel (Ed25519, base64url):
qxh_sOak_wQVqZifJjDcoy-TeWIF3NADjqsjta0GPlw
Signiert wird genau SecureChat|v1|company-key|<companyId>|<keyVersion>|<öffentlicher Schlüssel>. Das Risiko liegt damit bei uns: Würde jemand den Plattformschlüssel stehlen, könnte er sich als eine Marke ausgeben. Deshalb gibt es zusätzlich die Prüfung über den Link.
Das Unternehmen erzeugt sein eigenes Schlüsselpaar in seiner Infrastruktur mit unserem SDK (npx @securechat/sdk keygen) und lädt nur den öffentlichen Schlüssel zu uns hoch. Das Portal bietet nicht an, ihn im Browser zu erzeugen: Würde der private Schlüssel über unsere Server laufen, wäre das Versprechen nicht mehr überprüfbar.
Nicht verifizierte Unternehmen und Testmodus
Damit ein Unternehmen seine Integration testen kann, während wir es prüfen, kann es Testeinladungen erstellen. Sein Schlüssel ist nicht als verifiziert signiert – jeder könnte sich also als „Bank X“ registrieren und sie nutzen, um sich als eine Marke auszugeben. Deshalb:
- Die App öffnet eine Testeinladung nur, wenn du den Testmodus unter Einstellungen → Diagnose eingeschaltet hast. Er ist standardmäßig aus: Normale Kunden landen nie versehentlich in einer Testunterhaltung, auch wenn sie den Link erhalten. Schalte ihn nicht ein, nur weil dich jemand darum bittet: Ein echtes Unternehmen braucht ihn nicht, um mit dir zu schreiben.
- Diese Unterhaltungen zeigen immer das Banner „Nicht verifiziertes Unternehmen · Testumgebung“ und nie das Verifiziert-Abzeichen.
- Sie haben strenge Grenzen: 5 aktive Unterhaltungen pro Unternehmen, 200 Nachrichten des Unternehmens pro Tag und Einladungen mit höchstens 24 Stunden Gültigkeit. Sobald wir das Unternehmen verifizieren, werden seine Testunterhaltungen geschlossen.
Die Verschlüsselung ist dieselbe wie in einer normalen Unterhaltung. Was sich ändert, ist die Identitätsgarantie: In einer Testunterhaltung haben wir nicht geprüft, wer das Unternehmen ist.
Der Fingerabdruck im Einladungslink
Wenn das Unternehmen die Einladung mit dem SDK erstellt, hängt es an den Link ein Fragment #s=…&fp=… an. Der Browser sendet das Fragment nicht an den Server, wir sehen es also nicht, aber der Link reist über WhatsApp, einen Kanal, den wir nicht kontrollieren. Beim Einlösen:
- Die App prüft, ob der Schlüssel des Unternehmens, den wir liefern, den Fingerabdruck
fpaus dem Link hat. - Die App bindet ihren eigenen Schlüssel mit einem MAC an das Geheimnis
s, und das Unternehmen prüft das.
Würden wir einen der beiden Schlüssel austauschen, würde eines der beiden Enden es bemerken. Grenzen: Das gilt nur für das Einlösen per Link, nicht für den eingetippten Kurzcode, und manuell im Portal erstellte Einladungen enthalten dieses Geheimnis nicht.
Vom Unternehmen signierte Schlüsselrotation
Neben dem Verschlüsselungsschlüssel erzeugt das Unternehmen mit dem SDK einen Ed25519-Signaturschlüssel, der ebenfalls in seiner Infrastruktur bleibt; nur der öffentliche Schlüssel wird zu uns hochgeladen. Die App pinnt ihn beim ersten Kontakt zusammen mit dem Verschlüsselungsschlüssel. Rotiert das Unternehmen seinen Verschlüsselungsschlüssel, signiert es die Änderung mit diesem Signaturschlüssel: SecureChat|v1|company-key-rotation|<companyId>|<vorherige Version>|<vorheriger Schlüssel>|<neue Version>|<neuer Schlüssel>. Wir prüfen die Signatur, bevor wir den neuen Schlüssel akzeptieren, und die App prüft sie erneut.
- Rotation, signiert mit dem gepinnten Schlüssel: dezenter Hinweis („Das Unternehmen hat seinen Sicherheitsschlüssel erneuert; das Unternehmen selbst hat die Änderung signiert“).
- Ohne Signatur oder mit einem anderen Schlüssel signiert: deutliche Warnung. Bestätige es am besten über einen anderen Kanal mit dem Unternehmen, bevor du weitermachst. Unternehmen, die keinen Signaturschlüssel hinterlegt haben, rotieren immer auf diese Weise.
Warum das wichtig ist: Mit nur unserer Plattformsignatur sähen eine legitime Rotation und ein Austausch durch uns gleich aus. Mit der Signatur des Unternehmens braucht man, um sich als ein bereits gepinntes Unternehmen auszugeben, dessen Signaturschlüssel – und der läuft nie über uns. Die Plattformsignatur bleibt in beiden Fällen Pflicht. Der Signaturschlüssel selbst wird derzeit nicht rotiert: Ein Wechsel wird wie eine unsignierte Rotation behandelt.
Keine Forward Secrecy in v1
Jede Unterhaltung nutzt einen stabilen Schlüssel. Würde dein privater Schlüssel oder der des Unternehmens künftig zusammen mit den gespeicherten verschlüsselten Nachrichten bekannt, ließen sich auch frühere Nachrichten dieser Unterhaltung entschlüsseln. Protokolle wie Signal erneuern die Schlüssel mit jeder Nachricht, um das zu verhindern; wir haben das bewusst aus der ersten Version des Protokolls herausgelassen, und es steht auf unserer Roadmap.
Metadaten
Auch wenn wir den Inhalt nicht sehen, sehen wir, wer mit welchem Unternehmen schreibt, wann und wie oft, die ungefähre Größe jeder Nachricht (auf 256 Bytes gerundet), Größe und Datum jedes Anhangs, IP-Adressen und Gerätedaten. Daraus lässt sich einiges ableiten, und deshalb legen wir es in der Datenschutzerklärung offen.
Dein Verlauf ist an dein Gerät gebunden: Wenn du es verlierst, bekommst du jede Unterhaltung mit einer neuen Einladung des Unternehmens zurück, die den Schlüssel für dein neues Gerät neu versiegelt.
Eine Sicherheitslücke melden
Schreib uns an soporte@securechat-app.com mit dem Betreff „Sicherheit“. Bitte gib uns eine angemessene Frist, die Lücke zu beheben, bevor du sie veröffentlichst.