Mantengo un software heredado que utiliza MD5 de la siguiente manera:
- El cliente solicita una sal de 16 bytes al autenticar una cuenta.
- El servidor genera un salto de 16 bytes, lo vincula a la cuenta y lo envía de vuelta al cliente.
- El cliente agrega el salt de 16 bytes en una contraseña, hace MD5 (pass + salt) y envía el hash MD5 a través de la red.
- A medida que el servidor almacena la contraseña de texto sin formato en la base de datos, solo recupera la contraseña y compara MD5 (database_pass + salt) con el MD5 recibido (pass + salt) del cliente.
Como no puedo cambiar el funcionamiento del cliente, estaba pensando en qué podría hacer para dejar de almacenar la contraseña de texto sin formato en la base de datos. La idea con la que vine fue, en lugar de almacenar la contraseña de texto sin formato en la base de datos, almacenar la sal de 16 bytes utilizada por el cliente y, en el registro, generar el MD5 (pass + salt) y utilizar este MD5 como entrada para PBKDF2 con un sal de 64 bytes y HMAC-SHA512, 10000 iteraciones. Luego, para autenticarme, recibiría el MD5 (pase + sal) del cliente y PBKDF2 para verificar con el hash PBKDF2 almacenado.
Mi duda es, ¿esto hará que mi servidor sea más seguro? Como la contraseña y el MD5 (pass + salt) no se almacenarán en la base de datos, no se podrá acceder a la contraseña si mi base de datos presenta pérdidas, pero ¿hay algún problema con el uso de MD5 antes?
¿Hay algún problema posible con este enfoque? ¿Hay un mejor enfoque?
El único inconveniente que se me ocurre es que no tendré acceso a la contraseña del cliente después de una autenticación exitosa, por lo que cambiar el sistema de autenticación más tarde será difícil. Tendré el MD5 (pase + sal), pero luego sería imposible cambiar la sal.
Quiero hacer esto correctamente porque no podré cambiar el sistema más adelante. Cualquier ayuda es apreciada.