Para mantener las contraseñas lo más seguras posible, incluso si su servidor está integrado (incluso si uno de los administradores actúa como atacante), use un protocolo que no transfiera la contraseña del usuario y que ni siquiera transfiera un hash del Contraseña en el tiempo de autenticación del usuario.
Esto es posible con el protocolo de contraseña remota segura (SRP):
enlace
Con este protocolo SRP, un intercambio de 2 números aleatorios (1 enviado del usuario al servidor y 1 enviado del servidor al usuario) es suficiente para autenticar al usuario (como el propietario de la contraseña) y establecer un canal seguro (como lo hace SSL / TLS). Por supuesto, estos 2 números aleatorios contienen cierta información de autenticación, pero esta información se mezcla con números aleatorios de tal manera que, para un cuentagotas, los 2 números intercambiados son exactamente 2 números aleatorios. Consulte RFC 2945 o el documento original de Tom Wu, y la actualización SRP-6 de Tom Wu.
No es necesario transferir un hash ("verificador") una vez, a la hora de configurar la contraseña, para poder almacenarlo en el servidor. (Por supuesto, podría convertirse en el objetivo de un ataque de fuerza bruta). Después de eso, solo se intercambian números aleatorios para la autenticación, sin revelar nada más sobre la contraseña del usuario (y evitar un ataque de repetición).