cómo autenticar al usuario en la implementación cliente-servidor

3

Así que estoy tratando de implementar una aplicación cliente-servidor para enviar archivos a través de sockets SSL. Y estoy tratando de decidir sobre un diseño muy seguro para autenticar al cliente.

El servidor tendrá acceso a una base de datos que contiene todos los nombres de usuario y hashes para sus contraseñas (por lo tanto, si la base de datos es pirateada, las contraseñas serán "seguras").

Me pregunto si enviar la contraseña como un texto sin formato que luego se oculta en el servidor y se compara con el hash en la base de datos es la opción más segura o no.

Parece un poco inseguro enviar la contraseña de los clientes sin ninguna aleatoriedad, pero no veo de qué otra forma podría implementarse.

¡Cualquier puntero sería muy apreciado!

    
pregunta Rakim 10.10.2015 - 22:53
fuente

2 respuestas

4

Pasando el hash Si hash la contraseña en el cliente, corres el riesgo de introducir una falla de pasar el hash (PTH). Este es un fenómeno real y sorprendentemente común que afecta significativamente la seguridad de su aplicación. Ha sido un problema de seguridad clave en Windows durante años: enlace

(EDIT: el ejemplo de Windows anterior habla sobre las debilidades en el protocolo de desafío-respuesta NTLM. Un protocolo de desafío-respuesta bien diseñado no debería ser vulnerable a la PTH, aunque estos protocolos han sido ampliamente reemplazados por la seguridad de la capa de transporte. Vea más abajo .)

Esencialmente, si primero hash la contraseña, el valor que estás utilizando para autenticarte en el servidor es en realidad un hash de esa contraseña, y no la contraseña en sí. Por lo tanto, un atacante técnicamente solo necesita conocer el hash, y no la contraseña en sí. Como resultado, si la base de datos estaba comprometida, ahora está bloqueado, porque el atacante tiene todas las credenciales que necesita.

Solución Usted podría solucionar este problema mediante el hash en el cliente y el hash nuevamente en el servidor. Esto significa que la base de datos contendría una lista de hashes que aún deben ser crackeados antes de que sean útiles.

Sin embargo, esto no ayuda especialmente a su dilema de seguridad en el transporte. Cualquiera que sea el valor que envíe al servidor durante la autenticación (la contraseña o simplemente un hash) es el valor que un atacante puede usar para autenticarse con el servidor. Por lo tanto, un hash del lado del cliente siempre tiene el mismo perfil de riesgo que la propia contraseña. No estás más seguro transfiriéndolo como un hash.

TLS Como resultado, es mejor que centre su atención en una buena configuración de TLS. Asegúrese de que el cliente nunca enviará información confidencial a través de un protocolo de texto simple y que solo acepta certificados de servidor válidos. Considere la posibilidad de fijar el certificado si está disponible. Configure el soporte solo para los protocolos y conjuntos de cifrado más seguros tanto en el servidor como en el cliente.

Métodos de autenticación alternativos (todos los cuales tienen el potencial de ser invulnerables para pasar el hash si se implementan correctamente):

Tales protocolos son en gran medida innecesarios en las aplicaciones modernas debido a la mayor disponibilidad e interoperabilidad de TLS.

    
respondido por el itscooper 11.10.2015 - 11:15
fuente
0

Cuando ya está utilizando SSL, no hay razón para no usar también SSL para obtener la contraseña del usuario. Por supuesto, esto requerirá que usted tenga un certificado de una autoridad de certificados confiable o que el cliente confíe en su certificado. Cuando se habla de un ejecutable independiente que instalan sus usuarios, puede incluir el certificado de su servidor en él.

    
respondido por el Philipp 11.10.2015 - 01:02
fuente

Lea otras preguntas en las etiquetas