Also mein Problem ist folgendes:
Ich bin z.Z. dabei einen Chat zu schreiben (natürlich keinen Browser-Web-Chat, sondern einen Messenger).
Diesen möchte ich nun so gut wie möglich gegen das Ausspionieren / Manipulieren der gesendeten Daten schützen.
Dazu habe ich eine kleine Internet-Seite gebastelt, in der die Funktion meines Messengers dargestellt wird. ( im Feld "normaler Ablauf" ).
Hier also mal die Seite:
http://exchange0.funpic.de/
Ich hoffe, dass die Darstellung so halbwegs verständlich ist, wenn nicht, dann stellt mir ruhig Fragen dazu.
Im Feld "Man-In-The-Middle" kann man nun sehen, wie die gesendeten Daten -trotz Verschlüsselung- von Nutzer-X ausspioniert werden könnten, ohne das Nutzer-A und Nutzer-B etwas davon bemerken. (Allenfalls durch eine minimale Zeitverzögerung bei Nutzer-B)
Jetzt wollte ich mal fragen, wie ich die Übertragenen Daten am besten gegen so ein Szenario Schützen kann. Ich denke mal, dass ich das irgendwie machen kann, indem ich beim senden der Daten einen Hash von irgend etwas mitsende, um einen Nutzer auch als diesen Auszuweisen.
Aber ich bin mir nicht sicher, wie ich das am besten mache. Ich meine damit nicht Programmatisch, das bekomme ich hin. Sondern damit meine ich, welche Daten ich wie verarbeiten und wann versenden sollte, um einen Nutzer als den echten Nutzer ausweisen zu können.
Des weiteren würde ich mich auch über Informationen zu anderen Angriffs-Methoden, vor denen ich die Nachrichten schützen muss, sehr freuen.
Messenger unter anderem gegen Man-In-The-Middle schützen
Re: Messenger unter anderem gegen Man-In-The-Middle schützen
Hi,
um eine Man in the Middle Attacke zu verhindern müssen sich die einzelnen Clients gegenseitig authentifizieren, ohne das ein Angreifer die Authentifizerung nachahmen kann. In solchen Fällen kommt normalerweise eine asynchrone Verschlüsselung (Zertifikate) zum Einsatz.
Der Öffentliche Schlüssel des Zertifikats muss irgendwo hinterlegt sein, so das jeder andere Client darauf zugreifen kann. Du könntest nun z.B. folgendes machen: A verschlüsselt den Kommunikationskey mit dem Öffentlichen Schlüssel von B, und schickt diesen an B. Falls es sich wirklich um B handelt, kann dieser nun mit seinem Privatenkey wieder den Kommunikationskey entschlüssen und ganze muss noch einmal in die andere Richtung gemacht werden (Der key für die Kommunkation von A -> B und B -> A ist also ein anderer). Zum schluss schickst du in beide Richtungen noch ein echo request mit Zufallsdaten und falls diese wieder richtig ankommen, steht die Verbindung und ist sicher. Ein Angreifer käme nicht an den Kommunkationskey da ihm der private Key fehlt.
Die einzige Schwachstelle ist, das du irgendwie an den öffentlichen Key kommen musst und wissen musst ob dieser gefälscht ist. Um dies zu verhindern werden in der Regel alle öffentlichen Keys von einer zentralen Instanz signiert und der öffentliche Key dieser Signaturinstanz ist dann in deinem Programm eingebaut. Die ganze Sicherheits basiert dann aber auf der zentralen Signierungsstelle, würde der private Key von dieser öffentlich werden, könnte sich wieder jeder als B ausgeben.
Auf dem gleichen System basiert auch SSL, was aber auch immer wieder Schlagzeilen macht, weil private Keys von Signaturstellen gestohlen werden.
Dark
um eine Man in the Middle Attacke zu verhindern müssen sich die einzelnen Clients gegenseitig authentifizieren, ohne das ein Angreifer die Authentifizerung nachahmen kann. In solchen Fällen kommt normalerweise eine asynchrone Verschlüsselung (Zertifikate) zum Einsatz.
Der Öffentliche Schlüssel des Zertifikats muss irgendwo hinterlegt sein, so das jeder andere Client darauf zugreifen kann. Du könntest nun z.B. folgendes machen: A verschlüsselt den Kommunikationskey mit dem Öffentlichen Schlüssel von B, und schickt diesen an B. Falls es sich wirklich um B handelt, kann dieser nun mit seinem Privatenkey wieder den Kommunikationskey entschlüssen und ganze muss noch einmal in die andere Richtung gemacht werden (Der key für die Kommunkation von A -> B und B -> A ist also ein anderer). Zum schluss schickst du in beide Richtungen noch ein echo request mit Zufallsdaten und falls diese wieder richtig ankommen, steht die Verbindung und ist sicher. Ein Angreifer käme nicht an den Kommunkationskey da ihm der private Key fehlt.
Die einzige Schwachstelle ist, das du irgendwie an den öffentlichen Key kommen musst und wissen musst ob dieser gefälscht ist. Um dies zu verhindern werden in der Regel alle öffentlichen Keys von einer zentralen Instanz signiert und der öffentliche Key dieser Signaturinstanz ist dann in deinem Programm eingebaut. Die ganze Sicherheits basiert dann aber auf der zentralen Signierungsstelle, würde der private Key von dieser öffentlich werden, könnte sich wieder jeder als B ausgeben.
Auf dem gleichen System basiert auch SSL, was aber auch immer wieder Schlagzeilen macht, weil private Keys von Signaturstellen gestohlen werden.
Dark
Mein Blog: http://fds-team.de/cms/
Re: Messenger unter anderem gegen Man-In-The-Middle schützen
OK... hab mich jetzt mal ein Bischen über asymetrische Verschlüsselung informiert und das hört sich schonmal nicht schlecht an.
Dann werde ich das so machen, dass ich einen Hash aus der Nachricht bilde und über diesen Hash dann eine asymetrische Verschlüsselung drüber laufen lasse...
Das Ergebnis hänge ich dann an die Nachricht dran und dann kann ich das wie in meinem beispiel versenden. Der andere Nutzer kann dann mit seinem Schlüssel gegenprüfen, ob die Signatur gültig ist.
Jetzt besteht nur ein Problem. PB bietet keine Funktion zu asymetrischen Verschlüsselung. Ich hab auch schon nach Algorythmen gegoogelt, die ich möglicherweise integrieren kann, aber nichts gefunden.
Hat evtl. jemand von euch Erfahrung darin und kann mir da weiterhelfen?
Dann werde ich das so machen, dass ich einen Hash aus der Nachricht bilde und über diesen Hash dann eine asymetrische Verschlüsselung drüber laufen lasse...
Das Ergebnis hänge ich dann an die Nachricht dran und dann kann ich das wie in meinem beispiel versenden. Der andere Nutzer kann dann mit seinem Schlüssel gegenprüfen, ob die Signatur gültig ist.
Jetzt besteht nur ein Problem. PB bietet keine Funktion zu asymetrischen Verschlüsselung. Ich hab auch schon nach Algorythmen gegoogelt, die ich möglicherweise integrieren kann, aber nichts gefunden.
Hat evtl. jemand von euch Erfahrung darin und kann mir da weiterhelfen?