Por favor, perdóneme si mi pregunta es una reformulación de un problema común, ¡pero no estoy seguro de qué buscar!
Mi caso de uso es un programa cliente-servidor. El servidor se ejecuta en la PC de un usuario y el cliente se ejecuta en sus dispositivos móviles. Los clientes deben vincularse al servidor de forma segura (p. Ej., Ingresar un PIN o contraseña de una sola vez), y una vez que se completa el emparejamiento, debemos asegurarnos de que el cliente pueda verificar de forma segura el servidor, antes de transmitir datos confidenciales desde tiempo en tiempo.
Al principio de mi investigación, pensé que sería posible usar claves RSA, pero este enfoque parecía demasiado novedoso y complejo para implementarlo de manera segura.
Mi idea actual es implementar un esquema como este:
- En el emparejamiento inicial, el intercambio de claves Diffie-Hellman entre el cliente y el servidor
- El servidor muestra un PIN aleatorio y el cliente lo ingresa para su verificación (evitando mitm). Solo se permiten un par de intentos incorrectos de PIN antes de que se elimine el intento de emparejamiento.
- Dado que el servidor y el cliente ahora están de acuerdo con una clave secreta, simplemente podemos cifrar todas las comunicaciones con esta clave. Aunque el servidor puede tener varios clientes conocidos (por ejemplo, hasta diez clientes), el servidor podría simplemente verificar cualquier conexión entrante con las diez claves. Y como el cliente usa la misma clave secreta, si el servidor es un impostor, no será posible descifrarlo.
Ahora, mi pregunta, ¿es un esquema razonable o existe un protocolo estándar claro que pueda lograr objetivos similares?