He creado un chat entre dos partes (usando c #), y me pregunto qué tipo de debilidades he pasado por alto.
Descripción de su funcionalidad: Existen dos aplicaciones individuales: Cliente (2 instancias de TcpClient son las partes comunicantes) y Servidor (TcpListener, el relator de mensajes cifrados).
Nota: Supongo que las dos computadoras que contienen la aplicación cliente son seguras y no contienen ningún malware o virus que pueda alterar / monitorear la memoria, ingresar claves, hacer capturas de pantalla, etc. Por otra parte la aplicación del servidor puede estar en cualquier computadora que pueda estar potencialmente "comprometida" por falta de un término mejor.
Ahora, la funcionalidad de los Clientes es registrar el mensaje desde el teclado del usuario, cifrarlo (utilizando AES256 c # clases) y enviar los datos al servidor. Aunque antes de que pudieran enviarse los mensajes, los clientes intercambian claves públicas de acuerdo con el algoritmo de intercambio de claves Diffie Hellman , pero toda la comunicación entre los clientes funciona a través del servidor. Esencialmente, el servidor es una puerta de enlace, un puente entre los clientes, [1] , después de que el intercambio de claves y el servidor de generación de claves secretas solo recibe mensajes cifrados, no se molesta con su contenido, solo transmite el mensaje al otro cliente, que lo desencripta localmente. [2] .
He estado pensando en envolver mi NetworkStream en un SslStream, para hacer que el canal de comunicación sea más seguro, pero incluso si alguien puede "leer" el flujo, no puede leer el cifrado de todos modos, así que no creo que esto sea un error. falla crítica para mantener a salvo el MENSAJE SECRETO
No estoy protegiendo mi archivo .exe de ninguna manera (ni en el servidor ni en los clientes) ya que no creo que haya una protección del 100% si la computadora ya ha sido comprometida. En otras palabras, el chico malo puede descompilar mi .exe, ¿qué tan malo es esto e incluso debo tomar alguna clase de precauciones? Aunque las claves secretas generadas por DH se guardan localmente en las computadoras (se generan cada vez que se establece una conexión entre los clientes), ya que asumo que la computadora del Cliente es segura, no debería haber ningún problema con esto, ¿verdad?
Debilidades que he notado:
[1]: tiene acceso directo a la información de los clientes (dirección IP, cuándo se envió el mensaje, incluso cuántos caracteres contenía el mensaje (~ de 8 bytes)).
[2]: La aplicación del servidor puede modificarse para imitar al segundo cliente y capturar el canal, enviar su propia clave pública y recibir la clave pública de otro cliente, tomando el lugar del segundo cliente. Esto se puede resolver fácilmente si las partes intercambian un saludo en cualquier otro software de comunicación (skype, etc.) y confirman que están conectados entre sí (los mensajes se reciben al mismo tiempo que se envían, etc.).
P.S. Soy consciente de algunas de las debilidades que he mencionado anteriormente, pero no son críticas, me gustaría saber si hay fallas importantes que he omitido, y ¿cómo calificaría esta configuración de 0-10? ¿Qué puedo agregar / cambiar para mejorar lo que ya tengo / corregir fallas?