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

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):

Kryptografische Primitive des Umschlags v1
BausteinUmsetzung
Identität (dein Gerät und das Unternehmen)X25519-Schlüsselpaar
Schlüssel der Unterhaltung32 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üsselsEr 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 NachrichtXChaCha20-Poly1305 mit zufälliger 24-Byte-Nonce
Zugehörige DatenJede 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.
PaddingAuf Vielfache von 256 Bytes, um die genaue Länge zu verbergen
Signatur des UnternehmensschlüsselsEd25519, mit dem Plattformschlüssel
Signatur der SchlüsselrotationEd25519, mit dem eigenen Signaturschlüssel des Unternehmens (siehe unten)
FingerabdrückeBLAKE2b-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:

Was geschützt ist

Was nicht geschützt ist

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 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:

  1. Die App prüft, ob der Schlüssel des Unternehmens, den wir liefern, den Fingerabdruck fp aus dem Link hat.
  2. 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.

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.