Zur Einordnung: Dieser Artikel soll keine fachlich bis ins kleinste fundierte Betrachtung von Verschlüsselungs- und Sicherheitesmechanismen sein. Dazu fehlt mir sicherlich auch die Expertise. Vielmehr möchte ich auf etwas vereinfachte Weise anschaulich darstellen, was man bei der Nutzung von Messengern für die Sicherheit tun kann und beachten muss.
Bob schickt Alice über $Messenger eine private Nachricht mit einem netten privaten Bild. Natürlich möchte Bob, dass die Nachricht sicher bei Alice ankommt und - da sie ja privat ist - auch nur von Alice gelesen werden kann. Mal schauen, was die beiden dabei so alles beachten müssen.
(Als Vorraussetzung nehmen wir mal an, dass Bob und Alice einen Messenger benutzen, bei dem ein Provider mit einer Server-Infrastruktur beteiligt ist. Dieses Konzept verfolgen die meisten Messenger, um die Problematik zu lösen, dass nich immer alle Beteiligten einer Konversation ständig online sind. Es gibt auch Messenger, die eine direkt Peer-to-Peer-Verbindung herstellen, aber diese Konstallation muss nochmal anders betrachtet werden.)
Abhörsicher
Zunächst einmal wollen Bob und Alice natürlich sicher gehen, dass ihre Nachricht dem Transportweg von Bobs auf Alice' Endgerät nicht von von unbeteiligten mitgelesen werden kann, die zufällig den Datenstrom von Bob zum Provider oder vom Provider zu Alice mitbekommen. Hierzu eignet sich ersteinmal eine Transportverschlüsselung über SSL. Dieses bewährte Verfahren sichert den Datenverkehr zwischen zwei Geräten (z.B. Smartphone und Server des Providers) mittels Zertifikaten ab, die - sofern sie richtig implementiert wurden - sicherstellen, dass der Datenverkehr vom und zum Provider verschlüsselt ist und sich niemand dazwischen schalten kann.
Das Problem bei diesem Verfahren ist, dass die Verschlüsselung nur bis zum jeweiligen Endpunkt der Server-Software beim Provider genutzt wird. Sobald Bobs Nachricht dort ankommt, wird sie entschlüsselt und vom Provider im Klartext gepeichert, bevor sie - dann wieder verschlüsselt - an Alice weitergereicht wird. Der Provider und jeder, der irgendwie Zugriff auf den Server erlangt, könnte also mühelos alle Nachrichten der Nutzer lesen. Dieses Verfahren reicht daher auf jeden Fall nicht aus, um Bobs Nachricht an Alice zuverlässig abzusichern.
(Heutzutage dürfte es keinen Messenger-Dienst mehr geben, der ausschließlich eine solche Transportverschlüsselung ohne zusätzliche Verschlüsselungsmechanismen nutzt.)
Hinter verschlossenen Türen
Um zu verhindern, das Bobs Nachricht auf dem Weg zu Alice entschlüsselt und eventuell sogar im Klartext gespeichert wird, sollte der Provider von $Messenger also zumindest eine serverbasierte Verschlüsselung einsetzen, um die Daten seiner Nutzer zu schützen.
(Wie funktioniert so eine Verschlüsselung eigentlich?
Grob gesagt nutzt man immer ein Schlüsselpaar, jeder Teilnehmer einer Konversation besitzt einen privaten Schlüssel, den nur er kennt, und einen öffentlichen Schlüssel, den er weiter geben kann.
Teilnehmer A kann etwas mit dem öffentlichen Schlüssel von Teilnehmer B verschlüsseln. Diesen verschlüsselten Inhalt kann danach nur noch Teilnehmer B mit seinem privaten Schlüssel wieder lesbar machen. Genauso funktioniert das in der anderen Richtung. Teilnehmer B verschlüsselt etwas mit dem öffentlichen Schlüssel von Teilnehmer A, der mit seinem privaten Schlüssel wieder lesbar macht.
Eine zweite Funktion dieses Schlüsselpaares ist das Signieren von Inhalten. Teilnehmer A kann mit seinem privaten Schlüssel etwas signieren und jeder andere kann mit dem öffentlichen Schlüssel von Teilnehmer A diese Signatur überprüfen, also die Herkunft des Inhalts sicherstellen. Beides, verschlüsseln und signieren funktioniert einzeln und kann auch kombiniert werden.)
Bei der serverbasierten Verschlüsselung benutzt der Provider einen einzigen Schlüssel für alle Benutzer. Je nach Verfahren werden die Nachrichten noch mit einer Session-ID des Clients oder einer Nachrichten-ID verschlüsselt. Die so verschlüsselten Nachrichten werden dann bei Bedarf auf dem Server des Providers gespeichert und können dann auch sicher an den Client des Empfängers weitergeleitet werden. Das ist schonmal insoweit gut, dass jemand, der den Server des Providers unter Kontrolle bekommt, die dort gespeicherten Nachrichten nicht lesen kann, sofern der Provider seinen privaten Schlüssel entsprechend abgesichert hat. So weit so gut, Bob und Alice können also beruhigt sein, oder?
Das Problem bei dieser Art der Verschlüsselung ist aber, dass der Provider jederzeit Zugriff auf die Inhalte hat (und haben muss). Ein Fehler im Sicherheitssystem des Providers oder auch eine Anfrage einer Regierungsorganisation, mit der der Provider zusammen arbeitet, würde die Offenlegung der Inhalte von Bobs Nachricht an Alice zur Folge haben. Wie kann man das also noch besser machen?
Du siehst mich nicht
Das Zauberwort heisst: Ende-zu-Ende-Verschlüsselung.
Hierbei nutzt der Provider keinen einheitlichen Schlüssel, um die Inhalte der Nutzer abzusichern. Die Schlüssel der Benutzer werden direkt ausgetauscht und Bob verschlüsselt seine Nachricht direkt mit dem öffentlichen Schlüssel von Alice. Nur Alice hat also mit ihrem privaten Schlüssel Zugriff auf diese Nachricht. Auch der Provider hat keine Möglichkeit, die Inhalte von Bobs Nachricht an Alice zu entschlüsseln, er kann auch nicht von dritter Seite dazu gezwungen werden. Bob und Alice können also sicher sein, dass ihre Inhalte sicher und nur für die beiden lesbar transportiert werden? Ja, allerdings gibt es dabei einige Voraussetzungen, die die beiden beachten und umsetzen müssen.
Wer bin ich und wie viele?
Erstes Problem: Wie erhält Bob den öffentlichen Schlüssel von Alice, um anschließend die Nachricht an sie damit zu verschlüsseln. Das sicherste wäre hier, die beiden würden sich treffen und Alive übergibt ihren öffentlichen Schlüssel direkt an Bob, der ihn dann auf seinem Client speichern kann. Es wäre aber ziemlich mühsam, wenn jeder Nutzer von $Messenger das mit jedem seiner Chat-Partner so machen müsste. Also sendet $Messenger den öffentlichen Schlüssel von Alice automatisch an Bob. Bob hat dann verschiedene Möglichkeiten, um die Echtheit des Schlüssels zu prüfen. So kann Bob zum Beispiel Alice anrufen und dann mit ihr gemeinsam am Telefon den Hash-Wert der Schlüsselsignatur zu vergleichen, den beide in ihrem Client aufrufen können. Sollten sich die beiden doch einmal persönlich treffen, könnten Bob mit seinem Smartphone auch einen QR-Code scannen, den Alice auf ihrem Device anzeigen lässt. Nach diesem Vergleich ist Bob also sicher, dass der öffentliche Schlüssel, den er bekommen hat, auch wirklich von Alice stammt.
Das Schlüsselpaar von Alice wird automatisch per Zufallsgenerator erzeugt, wenn sei $Messenger auf ihrem Smartphone installiert. Wenn sie $Messenger neu installieren muss oder ein neues Gerät erhält, wird ein neues Schlüsselpaar erzeugt, dessen öffentlicher Teil auch wieder direkt an Bob gesendet wird. Das ist auch wichtig, denn Nachrichten, die Bob mit dem alten öffentlichen Schlüssel von Alice verschlüsseln würde, könnte Alice ab sofort nicht mehr lesen. Der Client von Bob macht ihn auf diesen Umstand auch aufmerksam, in dem er einen Text wie "Die Sicherheitsnummer von Alice hat sich geändert." anzeigt. Für Bob bedeutet das, dass er ab jetzt nicht mehr sicher sein kann, ob dieser neue öffentliche Schlüssel immer noch von Alice stammt. Erst, wenn die beiden über eine der oben beschriebenen Möglichkeiten die Herkunft des Schlüssels sicher gestellt haben, ist die Kommunikation wieder sicher.
(Ihr macht das bei allen Kontakten in eurem E2E-verschlüsselnden Messenger so, oder? )
Es gibt noch ein Problem bei der E2E-Verschlüsselung. Die Sicherheit funktioniert nur dann, wenn Bob und Alice sicher sein können, dass sie jeweils das Original ihrer privaten Schlüssel besitzen und es keine weiteren Kopien (z.B. beim Provider) gibt. Das die Erzeugung und Verteilung der Schlüssel automatisch durch den Client von $Messenger erfolgt, haben die beiden hier keine Möglichkeit, auf diesen Prozess Einfluß zu nehmen. Um hier eine Kontrollmöglichkeit zu haben, könnten Bob und Alice zum Beispiel einen $Messenger verwenden, dessen Programmcode offengelegt ist, also Open Source ist. Hier hätte man die Möglichkeit zu überprüfen, ob der Client ordentlich mit den erzeugten Schlüsselpaaren umgeht. Natürlich ist auch eine Bestätigung durch einen unabhängigen Prüfer möglich, hierbei ist es aber immer nötig, dass Bob und Alice diesem Prüfer auch vertrauen.
Zum schlechten Schluß
Nun haben Alice und Bob alle oben beschriebenen Aspekte berücksichtigt, nutzen Ende-zu-Ende-Verschlüsselung, haben die Echtheit und Vertraulichkeit ihrer Schlüsselpaare sichergestellt. Bob kann seine Nachricht mit dem privaten Foto also sicher an Alice schicken. Allerdings habe ich jetzt noch eine schlechte Nachricht für die beiden. Sobald Nachricht und Foto auf Alice' Device angekommen sind, werden sie wieder entschlüsselt, damit Alice sie lesen kann. Ab jetzt hat Bob leider keinerlei Kontrolle mehr darüber, was Alice (oder ihr Smartphone) mit den Inhalten macht. Wird das Foto auf eine (wie auch immer gesicherten) Cloud hochgeladen? Wer hat dort Zugriff darauf? Gibt Alice das Smartphone ab und zu an ihre Kinder, damit diese damit spielen? Landet die Nachricht auf dem Uralt-Laptop von Alice, der noch unter Windows XP läuft und von dem ein oder anderen Trojaner verseucht ist?
Es ist für unsere beiden wichtig und richtig, einen sicheren $Messenger zu nutzen und sicherzustellen, dass Inhalte vertraulich und sicher an den jeweils anderen Gesprächspartner weitergeleitet werden. Wir sollten uns aber auch bewusst sein, dass unser Kontent, wenn er erstmal beim (sicher richtigen) Empfäger angekommen ist, weiter gesichert und geschützt werden muss. Nur das hängt dann in keinster Weise mehr vom genutzten Messenger ab.