Primeiro de tudo, eu concordo com as outras respostas apontando que é muito mais seguro apenas evitar isso, e apenas armazenar hashes de senhas, não as próprias senhas, ou qualquer coisa que possa ser transformada de volta. para uma senha.
Há momentos, no entanto, em que você mais ou menos precisa permitir a recuperação. No caso de senhas, você geralmente deseja recuperar simplesmente permitindo que um administrador altere a senha quando / se necessário, em vez de recuperar a senha existente.
Outra possibilidade, no entanto, é permitir que o usuário armazene dados no servidor criptografado com sua própria senha. Neste caso, simplesmente permitir que um administrador altere a senha é não suficiente. A nova senha não funcionará para descriptografar os dados, e a maioria dos usuários considerará inaceitável que todos os dados criptografados fiquem inacessíveis quando / se esquecerem / perderem uma senha. Para essa situação, há uma alternativa razoavelmente segura e ainda permite a recuperação quando realmente necessário.
Em vez de usar a senha do usuário para criptografar os dados, você cria uma chave aleatória para criptografar os dados em si. Em seguida, você armazena essa chave em alguns locais: uma vez criptografada com a senha do usuário e, em outro local, criptografada com uma senha de administrador. Então quando (não realmente se) o usuário perder sua senha e não puder mais acessar os dados diretamente, você pode usar a senha do administrador para descriptografar a chave real e usá-la para recuperar os dados e / ou criptografar novamente a chave com a nova senha do usuário.
Se você não quiser confiar em um único administrador completamente, também poderá gerenciar isso. Por exemplo, você pode decidir que 5 pessoas terão chaves de administrador e você deseja que pelo menos três delas concordem antes que uma chave possa ser recuperada. Nesse caso, quando você armazena a senha criptografada para fins administrativos, você a armazena várias vezes, uma vez para cada conjunto de três dos cinco administradores (o que não ocupa muito espaço, já que você está armazenando apenas vários chaves , a ~ 256 bits cada, não múltiplas cópias dos dados). Cada uma dessas cópias é criptografada sucessivamente com (os hashes de) cada uma das senhas para esses três administradores.
Para descriptografá-lo, você precisa identificar os três administradores que estão inserindo suas senhas e escolher a chave criptografada adequada para esse conjunto de três e, em seguida, descriptografar usando cada uma das três senhas para finalmente obter a chave original. Você pode usar isso para recuperar os dados em si, ou pode apenas criptografá-los novamente com a (hash of) nova senha do usuário para que eles ainda possam acessar seus dados.
Quando você faz isso, porém, você realmente precisa usar um algoritmo de criptografia padrão e (por strong preferência) uma implementação padronizada, bem conhecida e completamente estudada.