Guten Abend (ist ja schon 18 Uhr ),
ich hoffe auf konstruktive Kritik bezüglich der Prävention von sogenannten MITM-Angriffen.
Durch die Anregung von @EaranMaleasi ( dankeschön ), habe ich mir überlegt,
einen RSACryptoServiceProvider Instanz anhand eines Schlüsselsatzes zu generieren, dessen Schlüssel-Tupel bei identischen Sätzen unterschiedlich auf anderen Maschinen, aber
immer identisch auf einer Maschine ist.
Dadurch war es möglich, immer den selben Public-Key zu erzeugen ( Reproduktion ) und diese dann als XML zu exportieren.
Ich habe anschließend den Hash dieser XML Datei berechnet und sie beim Client eingetragen( quasi "hard-coded" ).
Der Client ist somit einer einzigen Maschine zugewiesen.
Das Ganze sieht in einem Code-Beispiel so aus:
Nach der erfolgreichen Verbindung des Clients mit dem Server,
wird dem Client die Public-Key übermittelt,
sein Hash wird errechnet und mit dem Wert des Felder "verificationHash" parallelisiert .
Wenn diese nicht identisch sind, wird eine Exception geworfen:
Ist dieser Ansatz gelungen?
ich hoffe auf konstruktive Kritik bezüglich der Prävention von sogenannten MITM-Angriffen.
Durch die Anregung von @EaranMaleasi ( dankeschön ), habe ich mir überlegt,
einen RSACryptoServiceProvider Instanz anhand eines Schlüsselsatzes zu generieren, dessen Schlüssel-Tupel bei identischen Sätzen unterschiedlich auf anderen Maschinen, aber
immer identisch auf einer Maschine ist.
Dadurch war es möglich, immer den selben Public-Key zu erzeugen ( Reproduktion ) und diese dann als XML zu exportieren.
Ich habe anschließend den Hash dieser XML Datei berechnet und sie beim Client eingetragen( quasi "hard-coded" ).
Der Client ist somit einer einzigen Maschine zugewiesen.
Das Ganze sieht in einem Code-Beispiel so aus:
C#-Quellcode
- DotTcpServer<User> tcpServer = new DotTcpServer<User>(225, "15^B3PrzdPpv3sty?vR8sLRX+9ktB7M6USrhvF_T*TfFdUPms$EbRTmx7C7ne9v4u5*%#YqwEfeqvx?r!qy#A@ZjEVV9^SkB%WDb#h5&xfsp=RPp+xK!gubczF6uMx?!W?eQJXV!_bN**P%JAT!LuP+F5C5PbQM8cmEz3");
- tcpServer.MaximumClients = 1;
- tcpServer.StartSession();
- DotTcpClient tcpClient = new DotTcpClient("192.168.0.215", 225, "rofl");
- tcpClient.OnConnected += new DotTcpClient.OnConnectedDelegate(() =>
- {
- tcpClient.Send("Hello world encrypted!");
- Console.WriteLine("[ECHO]" + tcpClient.Receive());
- });
- tcpClient.SetVerificationHash("96-0E-EF-3C-EF-57-63-24-36-FD-11-92-0D-72-1A-C9");
- tcpClient.StartSession(1000);
Nach der erfolgreichen Verbindung des Clients mit dem Server,
wird dem Client die Public-Key übermittelt,
sein Hash wird errechnet und mit dem Wert des Felder "verificationHash" parallelisiert .
Wenn diese nicht identisch sind, wird eine Exception geworfen:
C#-Quellcode
- byte[] receivedDataDecrypted = new byte[0];
- int dataLength = binReader.ReadInt32();
- receivedDataDecrypted = binReader.ReadBytes(dataLength);
- string inputXML = receivedDataDecrypted.DeserializeToDynamicType();
- // VERIFY PUBLIC KEY HTML
- if (!verificationHash.Equals(Utilities.GetMD5Hash(inputXML)))
- throw new Exception("Connection is invalid!( Common in MITM-Attacks)");
Ist dieser Ansatz gelungen?
Und Gott alleine weiß alles am allerbesten und besser.