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?