Laden...

Verschlüsselter Chat Client mit C#, PHP und MySQL

Erstellt von bloggeroli vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.711 Views
B
bloggeroli Themenstarter:in
15 Beiträge seit 2010
vor 8 Jahren
Verschlüsselter Chat Client mit C#, PHP und MySQL

Hallo,

ich schreibe momentan an einem Chat Client in C#, welcher über einen zentralen Server funktioniert, auf welchem per PHP auf eine MySQL Datenbank zugegriffen wird.
Der Client und der Server soll leicht und universell einsetzbar sein, sowie gewährleisten, dass nur die richtigen Sender und Empfänger die Nachrichten lesen können (und natürlich noch so viele anderen Sicherheitsziele wie möglich erfüllen).
Aus diesem Grund verzichte ich auch auf TLS, so kann der Server quasi auf jedem kostenlosen Hoster laufen.
Das Prinzip ist das folgende:
Beim Erstellen eines neuen Benutzers wird ein RSA Schlüsselpaar erstellt, der private Schlüssel auf dem lokalen PC mit AES verschlüsselt gespeichert, der öffentliche in die Serverdatenbank eingetragen.
Der Login ist eine Challenge Response Authentication, der Server erstellt einen zufälligen String und verschlüsselt diesen mit dem öffentlichen Key, der Client entschlüsselt diesen.
Möchte man nun eine Nachricht an einen anderen Nutzer schicken, fragt der Client den Server nach dessen Public Key, mit diesem verschlüsselt der Client dann die Nachricht, der Empfänger entschlüsselt diese. Der Server benutzt PHP Sessions um sicherzustellen, dass nur die richtigen Benutzer ihre Nachrichten abholen können bzw. senden können.

Nun würde ich von euch wissen, was ihr davon haltet! Als erstes geht es mir um die Sicherheit (ja die Benutzeroberfläche ist noch ziemlich hässlich, das wird geändert so gut ich's kann). In diesem Beitrag habe ich beschrieben, welche Angriffsmöglichkeiten ich noch sehe und wie diese abzuwehrend sind.
Dann würde mich auch noch speziell das allgemeine Prinzip interessieren, also Übertragung der Daten mittels eine zentralen Datenbank etc.

Den Code gibt's hier auf GitHub.

Aber natürlich freue ich mich über Anregungen und Kommentare in alle Richtungen!

Viele Grüße
Oliver

C# Tipps und Tricks: http://csharp-tricks.blogspot.com/

16.807 Beiträge seit 2008
vor 8 Jahren

Also ich kann Deinen Gedankengängen in Deiner Beschreibung oft nicht folgen.
Was hat zB RSA für das Speichern eines Passworts für einen Vorteil, wenn die Übertragung dessen im Klartext und nicht geschützt durch HTTPS/SSL geschieht?
Dass Passwörter heute gesalzen sind und das mit einem Ein-Wege-Verfahren ist Standard.

Man würde heutzutage einen Chat viel eher auf Basis von WebSockets (zB SignalR) aufsetzen und sich die Gegebenheit eben von HTTPS zu nutze machen.
Server-Seitig die (Login-)Daten sicher zu speichern ist dann eine Sache von wenigen Zeilen.
Das ist übrigens das Standard-Beispiel, das man zu WebSockets meist findet - weil es einfach sehr sehr trivial ist 🙂

Was also nun an dem Chat "besonders verschlüsselt" ist, das erleuchtet mir irgendwie nicht so arg 🤔

PS: da es sich hier nicht um ein Projekt handelt, das den Regeln gerecht wird sondern Du eigentlich ein Review willst habe ich das auch in das passende Forum verschoben.

PPS:Wenn man einen Blog betreibt, dessen Name "CSharp Tricks" lautet und das somit suggertiert, dass es sich um nützliche Tipps handelt, dann solltest Du das Mindeste erfüllen und Dich an der Namensorientierung, die Microsoft empfiehlt, orientieren.
Denn so (und nicht nur die Benennung von Methoden und Variablen) ist der Code teilweise grausig, wenn ich ehrlich sein darf. Denke das passt hier auch ins Review als Feedback.

B
bloggeroli Themenstarter:in
15 Beiträge seit 2010
vor 8 Jahren

Hallo,

danke für deine Antwort, ja Namensgebung und Code Schönheit ist nicht so optimal gebe ich zu, wird geändert. Ansonsten kann ich denke ich aber doch behaupten, dass mein Blog ein paar nützliche Tipps bietet 😉

Das mit Web Sockets habe ich mir auch gedacht, da werde ich nochmal reinschaun, mein Ziel war halt der Entwurf eines überall einsetzbaren Servers, und HTTPS ist nun mal nicht überall verfügbar.

Um auf HTTPS und TLS z.B. verzichten zu können (und auch, um den Lesern einen Einblick in deren Funktionsweise zu bieten), versuche ich, ähnliche Funktionen "allein" mit C# und PHP zu implementieren.
Der Login ist eine Challenge Response Authentifizierung (wie erwähnt) basierend auf RSA, hier wird also nichts im Klartext übertragen - der eigentliche Login Vorgang ist dadurch sicher.
Außerdem werden alle Nachrichten mit RSA verschlüsselt, auch hier ist auf jeden Fall (unter Annahme dass RSA sicher ist, ebenso die .Net Implementierung) gewährleistet, dass nur Sender und Empfänger ihre Nachrichten entziffern können.

C# Tipps und Tricks: http://csharp-tricks.blogspot.com/

125 Beiträge seit 2008
vor 8 Jahren

Habe deine Implementierung noch nicht angeschaut aber lese heraus, dass du das Challenge-Response Verfahren mit asymmetrischer Verschlüsselung implementiert hast.

Wenn die Schlüssellänge lang genug ist sollte es mmN sicher sein.
Du könntest das Programm erweitern indem du verschiedene Authentifizierungs-Verfahren implementierst wie zb MS-CHAPv2 oder Fiat-Shamir/Zero-Knowledge 😃

Werde in der Richtung auch etwas forschen 😃 und evtl. auch was schreiben 😃

1.361 Beiträge seit 2007
vor 8 Jahren

Hi Bloggeroli,

Meiner Meinung nach ist bei dir (wie bei vielerlei Verschlüsselungstechniken) das Hauptproblem der Schlüsselaustausch.

Wenn du öffentliche Schlüssel austauschen möchtest, brauchst du eine Public-Key-Infrastruktur, oder kurz: irgendeine Trusted Party.

Ich sehe bei deinem Konzept für einen Chatteilnehmer niemanden, der trusted wäre.
Weder das Gegenüber kenne ich vorher, noch bietet dein Server eine authentifizierte Kommunikation. Du nutzt überall nur selbst-signierte Zertifikate, mit all offenen Problemen für beliebige Man-in-the-Middle Angriffe.

Das kannst du nur verhindern, indem du bestehende PKIs nutzt, sei es SSL-CAs oder Alternativen.

Aber so kann ich einfach jeglichen Verkehr vom Client zu deinem Chatserver über mich leiten, MITM spielen und jegliche Verschlüsselung untergraben.

beste Grüße
zommi