Server-Client Sicherheit: Fragen.

  • C#
  • .NET (FX) 4.5–4.8

    Server-Client Sicherheit: Fragen.

    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:

    C#-Quellcode

    1. 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");
    2. tcpServer.MaximumClients = 1;
    3. tcpServer.StartSession();
    4. DotTcpClient tcpClient = new DotTcpClient("192.168.0.215", 225, "rofl");
    5. tcpClient.OnConnected += new DotTcpClient.OnConnectedDelegate(() =>
    6. {
    7. tcpClient.Send("Hello world encrypted!");
    8. Console.WriteLine("[ECHO]" + tcpClient.Receive());
    9. });
    10. tcpClient.SetVerificationHash("96-0E-EF-3C-EF-57-63-24-36-FD-11-92-0D-72-1A-C9");
    11. 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

    1. byte[] receivedDataDecrypted = new byte[0];
    2. int dataLength = binReader.ReadInt32();
    3. receivedDataDecrypted = binReader.ReadBytes(dataLength);
    4. string inputXML = receivedDataDecrypted.DeserializeToDynamicType();
    5. // VERIFY PUBLIC KEY HTML
    6. if (!verificationHash.Equals(Utilities.GetMD5Hash(inputXML)))
    7. throw new Exception("Connection is invalid!( Common in MITM-Attacks)");


    Ist dieser Ansatz gelungen?
    Und Gott alleine weiß alles am allerbesten und besser.