¿La autenticación por desafío del cliente es segura?

3

Tengo una aplicación instalada en las máquinas de los clientes, un servidor y un sitio web regular entre los dos. Para que los clientes no configuren nada (credenciales de usuario, configuración de proxy ...), la aplicación se comunica con el servidor a través del navegador.

Para evitar que cualquier sitio web aleatorio se comunique con la aplicación, hemos decidido implementar el siguiente mecanismo de desafío automático, utilizando cifrado asimétrico público / privado .

Para simplificar, no hablaré sobre el navegador, pero tenga en cuenta que es el navegador el que pasa los mensajes entre la aplicación y el servidor. ambos no se conocen directamente uno del otro.

He generado un par de claves públicas / privadas tanto para la aplicación como para el servidor. Cada uno conoce la clave pública del otro y su propia clave privada. La clave privada de la aplicación se implementará en las computadoras del cliente, por lo que no es "realmente" secreta (es una aplicación de línea de negocios, pero siempre es posible que la clave termine "en la naturaleza").

  • La aplicación genera un token aleatorio (un guid) y lo envía al servidor.
  • El servidor cifra el token con la clave pública de la aplicación, firma el token (original) con la clave privada del servidor y luego envía ambos a la aplicación.
  • La aplicación compara la firma con el token (usando la clave pública del servidor) y verifica que los datos descifrados coincidan (usando su propia clave privada). Si ambos coinciden, el servidor está autorizado para realizar otras operaciones.

¿Es lo suficientemente seguro para asegurarse de que el servidor esté autorizado para realizar solicitudes? De lo contrario, ¿cómo se pueden falsificar / falsificar las solicitudes y cómo puedo asegurarlas más?

Actualizar

Desde entonces me he dado cuenta de que este esquema no implementa autenticación mutua . Dado que el servidor no se llama directamente desde la aplicación sino solo a través del navegador, y el navegador se autentica en el servidor (usando WCF), ¿es necesario?

    
pregunta thomasb 04.10.2016 - 16:17
fuente

1 respuesta

1

Este protocolo de respuesta de desafío no autentica realmente el servidor. Aquí se comparte una guía con el servidor, pero la confianza realmente depende de las claves del servidor y del cliente. ¿Por qué no simplemente usar esas teclas para la comunicación entonces?
Mi recomendación sería tener un mecanismo siguiente:

  1. La aplicación genera un GUID aleatorio y lo cifra con su clave privada
  2. El servidor valida la novedad del GUID y luego crea una clave de sesión para compartir con la aplicación. La clave y el GUID se envían a la aplicación mediante el cifrado con la clave pública del cliente y se firman con su propia clave privada.
  3. La aplicación descifra la clave de sesión y envía el GUID cifrado por la clave de sesión al servidor.

De esta manera, tiene una autenticación bidireccional si tiene instalada la detección de reproducción correcta. El uso de la clave de sesión mitiga el riesgo de que su clave quede expuesta.

Si desea continuar con su enfoque, aquí hay algunos consejos:

  

Para evitar que cualquier sitio web aleatorio se comunique con la aplicación, hemos decidido implementar el siguiente mecanismo de desafío automático, usando cifrado público / privado asimétrico.

La aplicación es totalmente dependiente del sitio web. Si no confía en el sitio web, ¿cómo puede confiar en los mensajes que recibe de él?

  
  • La aplicación compara la firma con el token (usando el servidor   clave pública), y verifica que los datos descifrados coincidan (utilizando su propia   llave privada). Si ambos coinciden, el servidor está autorizado para hacer   otras operaciones.
  •   

¿Qué pasa si alguien hace un XSS en el sitio web de confianza? El script puede cambiar la dirección IP / identificador del servidor cuando envía la respuesta a la aplicación. De esta manera, se autentica un servidor incorrecto.

Para responder completamente a su pregunta, necesitaríamos más información sobre su implementación.

  • ¿Confía en la seguridad del sitio web que utiliza la aplicación? Un atacante puede usar el sitio web como un vector de ataque para entrometerse en su comunicación.

  • ¿Se está comunicando el sitio web con el servidor mediante TLS?
    Si no está sobre TLS, cualquier parte puede actuar como el sitio web para el servidor y mantenerlo ocupado con guías nuevas / repetidas.

respondido por el Limit 05.10.2016 - 16:28
fuente

Lea otras preguntas en las etiquetas