No debe almacenar las contraseñas de sus usuarios, ni siquiera en forma cifrada. Solo debe almacenar el hash/digest necesario para la autenticación. Entonces, no puede "recuperar" la contraseña (porque no la conoce), simplemente puede restablecerla y/o darle al usuario una contraseña temporal única que le permite establecer una nueva contraseña.
Actualización: si está haciendo lo anterior, el procedimiento estándar es tener un formulario "require-password-reset". El usuario ingresa su identificación (generalmente su correo electrónico) y se genera un "token" (por ejemplo, una cadena aleatoria), se almacena en alguna tabla con fecha de vencimiento y se envía a su correo electrónico junto con un enlace al "restablecimiento de contraseña" formar. De esta forma, se controla el token, el usuario puede ingresar una nueva contraseña y se le indica que intente un nuevo inicio de sesión.
Actualización 2: Puede surgir un pequeño problema de privacidad: ¿Qué debemos hacer si la identificación de usuario (correo electrónico, nombre de usuario o lo que sea) ingresada en el formulario de solicitud no existe en nuestra base de datos? Para enviar un mensaje "El usuario no existe. Verifique la identificación y vuelva a intentarlo". puede estar bien, pero en algunos casos podría causar un problema de privacidad: cualquiera puede verificar si otra persona está registrada en su base de datos. Si desea evitar eso, debe emitir el mismo mensaje ("un correo ha sido enviado con instrucciones ...") incluso si el usuario no fue encontrado (y por lo tanto, no se envió realmente un correo). Problemas de privacidad similares aconsejan simplemente emitir el mensaje "login incorrecto: usuario incorrecto o contraseña" cuando el usuario intenta iniciar sesión sin éxito: no divulgue si se trata de un usuario o contraseña incorrectos.
Si utiliza una contraseña generada al azar, asegúrese de ajustar la complejidad para que coincida con la capacidad de los usuarios. es decir, no utilice muchos elementos no alfanuméricos, si no es que sus usuarios son expertos en informática. Además, asegúrese de recortar el espacio en blanco de las contraseñas introducidas, ya que es probable que se corten y peguen de los correos electrónicos, que a menudo captan espacios en blanco adicionales. –
Algunas restricciones de caracteres y sustituciones también son buenas ideas: elimine '{0,1,2,3,5, l}' de la lista de caracteres, baje todo y aplique un mapa como '[0,1,2, 3,5, l] -> [o, i, z, b, s, i] 'a la contraseña que le devuelve el usuario. "3" está ahí porque "B" a menudo se confunde con "3" cuando no hay un contexto familiar, los demás deben estar claros. –