Estoy escribiendo dos aplicaciones que están diseñadas para ejecutarse en dos dispositivos separados. Es similar a una solución de escritorio remoto como TeamViewer.
Lo que sigue a continuación es mi propuesta para un proceso de autenticación entre dos dispositivos A y B, donde A es la autoridad. Puede ser un poco detallado, pero solo quiero ser exhaustivo:
1) User inputs a password to A
2) A generates public and private key from password
3) A saves private key to memory
4) A saves private key to file
5) A appends salt to password in memory
6) A digests password + salt with SHA128.
7) A saves the hash to file.
8) B connects to A through TCP
9) A sends public key to B
10) User inputs (the same) password to B
11) B encrypts password with the public key obtained from A
12) B sends the encrypted password to A
13) A decrypts the password with private key
14) A applies steps 5 and 6
15) A compares the hash of the obtained password with the stored hash.
Este proceso no implica enviar la contraseña en texto sin formato a través de la red para que la parte sea segura, por lo que mis preguntas son:
¿Debería utilizarse en su lugar la criptografía de clave simétrica? Si es así, ¿cómo se haría esto sin que se transmita la contraseña de texto sin formato?
Parece que almacenar tanto el hash de la contraseña como la clave privada generada a partir de la contraseña es excesiva. ¿Lo es?
En una nota al margen, todo esto ocurre en una LAN.