Tengo la siguiente configuración:
Un servidor y un cliente se conectarán a través de tcp. El servidor y el cliente tienen acceso a la clave secreta previamente compartida. Cuando el cliente se conecta al servidor, tanto el cliente como el servidor necesitan conocer la clave, por lo que necesitan usar la misma clave para autenticarse o fallará.
Se me ocurrió el siguiente proceso y me gustaría saber si hay algo obviamente malo en él que no haya visto. El cifrado real no es
Relevante en este caso.
Entonces esto es lo que sucede cuando el cliente se conecta:
- El servidor genera una sal de 16 bytes (salt1).
- El servidor calcula hashServer1 = HASH (key + HASH (key + salt1)).
- El servidor envía salt1 al cliente.
- Los clientes calculan utilizando el salt1 hashClient1 = HASH recibido (tecla + HASH (tecla + sal1)).
- El cliente genera sal de 16 bytes (salt2).
- El cliente calcula hashClient2 = HASH (key + HASH (key + salt2)).
- El cliente envía (hashClient1 + salt2) al servidor.
- El servidor comprueba si hashClient1 == hashServer1 recibido y si no se rompe.
- El servidor calcula utilizando el servidor hash sal2 recibido2 = HASH (tecla + HASH (tecla + sal2)).
- El servidor envía hashServer2 al cliente.
- El cliente comprueba si hashServer2 == hashClient2 recibido y si no se rompe.
Si no me equivoco, esto debería ser bastante seguro cuando se usa un algoritmo hash fuerte. La clave nunca se envía como texto claro y, debido a la sal, los datos son diferentes cada vez.
EDITAR: se modificó la sal utilizada para el hashing de saltX a HASH (clave + saltX).