Hola,
Trataré de explicar mi problema de la forma más simple que pueda. El caso es el siguiente:
Tengo una pequeña plataforma web orientada a almacenar y mostrar datos de cierta sensibilidad.
Los usuarios realizan el acceso a través de un formulario web que verifica su contraseña a través de la función password_verif() de PHP con el hash almacenado en una base de datos. Si es correcto, la contraseña se utiliza para desencriptar un salt (almacenado en esa misma base de datos) y, una vez desencriptado se almacena como variable de sesión y la contraseña remitida por el usuario es desechada.
Cuando un usuario se registra, se genera de forma aleatoria ese salt, y se encripta utilizando la propia contraseña como salt con AES_ENCRYPT($salt_aleatorio, $contraseña_usuario) para después ser almacenado en la base de datos. Con esto, evito que la contraseña del usuario se almacene en la base de datos, así como cualquier otro dato que pueda utilizarse para desencriptar el salt.
A la hora de realizar un registro por parte del usuario en la base de datos (la que los usuarios utilizan para almacenar y leer la información que almacenan) el sistema guarda dicho registro a través de AES_ENCRYPT($contenido_a_almacenar, $SESSION_['SALT']) e igualmente lo desencriptan con AES_DECRYPT para poder verlo.
A la hora de realizar un cambio de contraseña no hay mayor problema, como el usuario facilita su contraseña actual, el Salt se desencripta con la antigua contraseña y se reencripta con la nueva, se almacena y se realiza un UPDATE al hash de la contraseña almacenado. Con lo cual, aunque la contraseña cambie los registros pueden seguir siendo desencriptados ya que no es la contraseña lo que los encripta, sino el salt.
El problema viene cuando un usuario pierde su contraseña, un UPDATE en el hash de la DB de la contraseña sólamente daría acceso al usuario al interior de la página web, mientras que cuando intente desencriptar sus registros, verá que no se muestra nada ya que el salt no está encriptado con su nueva contraseña.
¿Cómo podría lograrse, sin almacenar la contraseña de usuario ni datos que permitan desencriptar el salt, que un usuario pudiera recuperar su contraseña? (Tampoco sería buena idea utilizar información del usuario como el e-mail o número de teléfono ya que estos podrían usarse para desencriptar los registros en caso de un ataque o robo de información en la base de datos).