Conexión TCP del servidor de cliente: enviar una contraseña

0

Soy nuevo en ciberseguridad y estoy escribiendo un servidor TCP con la API de Java Socket. Hay una clase de cliente y servidor. La clase de servidor es lo que se ejecutaría en un servidor, escucha en un puerto específico y acepta conexiones de socket. Si la parte cliente del programa intenta conectarse, debe enviar la contraseña cifrada correcta al servidor. El servidor tiene una lista de contraseñas correctas, hash con SHA-256.

Tengo un sistema de clave pública-privada RSA configurado, donde el servidor mantiene la privacidad y envía la clave pública al cliente. El cliente tiene la contraseña sin procesar con SHA-256 y luego usa la clave pública para cifrarla antes de enviarla a través del socket.

Lo que me preocupa (y estoy seguro de que hay otros problemas) es que un atacante usará la clave pública para probar un montón de contraseñas con el servidor. Si genero claves simétricas AES usando una cadena especial codificada en el lado del cliente y del servidor, ¿tendría sentido cifrar la clave pública con la clave simétrica antes de enviarla por cable y usar esas claves para una comunicación adicional? >

No me preocupa otra cosa que no sea la contraseña que se envía del cliente al servidor justo después de que se acepta el socket.

    
pregunta wilson421 26.10.2017 - 00:06
fuente

1 respuesta

2

Si bien no hay una buena razón para no usar TLS para salvaguardar esto, su enfoque parece correcto y aquí es por qué:

La complejidad computacional del hashing sha 256 y su cifrado con algoritmos (asimétricos o híbridos) es bastante alta; no hay (actualmente) una forma viable de fuerza bruta que si las contraseñas son razonablemente fuertes.

Además, si le preocupa la fuerza bruta, puede prohibir una IP por x horas si la contraseña se ingresa incorrectamente y seguidamente, como lo hace fail2ban, y / o agregar tiempo adicional entre los inicios de sesión como lo hace GNU / Linux .

Dicho esto: hay una manera perfectamente buena de autenticar a los usuarios de forma segura y eso es TLS.

Para abordar su intento de cifrar la clave pública con cifrado simétrico: no hay ganancia en eso. Si usa pares de claves razonablemente fuertes, no debería ser computacionalmente generable la clave privada a partir de la clave pública: los sistemas criptográficos asimétricos están diseñados de tal manera que las claves públicas deben ser públicas (¡de ahí el nombre!).

Agregar una capa de AES no dañaría eso de ninguna manera, pero presenta problemas adicionales: el cliente puede revertirse para obtener la clave y hacer que su intento sea inútil, y puede ser depurado para recuperar la clave simétrica y / o pública. de memoria. Además, agrega más complejidad a su software, lo que aumenta la probabilidad de fallas y errores sin un beneficio.

    
respondido por el Tobi Nary 26.10.2017 - 11:08
fuente

Lea otras preguntas en las etiquetas