Прежде всего, я согласен с другими ответами, указывающими на то, что гораздо безопаснее просто избежать этого и хранить только хэши паролей, а не сами пароли или что-либо, что может быть преобразовано обратно в пароль.
Однако бывают случаи, когда вам нужно более или менее разрешить восстановление. В случае паролей вы обычно хотите восстановить, просто позволяя администратору сменить пароль при необходимости, а не восстанавливать существующий пароль.
Другая возможность, однако, заключается в том, что вы позволяете пользователю хранить данные на сервере, который зашифрован их собственным паролем. В этом случае, просто позволяя администратору изменить пароль является не достаточным. Новый пароль не будет работать для расшифровки данных, и большинство пользователей сочтет неприемлемым, что все их зашифрованные данные станут недоступными, когда / если они забудут / потеряют пароль. Для этой ситуации есть альтернатива, которая является достаточно безопасной и позволяет восстановление, когда это действительно необходимо.
Вместо того чтобы использовать пароль пользователя для шифрования данных, вы создаете случайный ключ для шифрования самих данных. Затем этот ключ хранится в нескольких местах: один раз зашифрованный с помощью пароля пользователя, а в другом месте зашифрованный с помощью пароля администратора. Затем, когда (не совсем так) пользователь теряет свой пароль и больше не может напрямую обращаться к данным, вы можете использовать пароль администратора для расшифровки реального ключа и использовать его для восстановления данных и / или повторного шифрования ключа с помощью новый пароль пользователя.
Если вы не хотите полностью доверять одному администратору, вы также можете управлять этим. Например, вы можете решить, что 5 человек будут иметь ключи администратора, и вы хотите, чтобы как минимум три из них согласились, прежде чем ключ можно будет восстановить. В этом случае, когда вы храните зашифрованный пароль для административных целей, вы сохраняете его несколько раз, по одному для каждого набора из трех из пяти администраторов (что не занимает много места, поскольку вы храните только несколько ключей , ~ 256 бит за штуку, а не несколько копий данных). Каждая из этих копий последовательно шифруется с помощью (хэшей) каждого из паролей этих трех администраторов.
Чтобы расшифровать его, вам нужно идентифицировать трех администраторов, которые вводят свои пароли, и выбрать правильный зашифрованный ключ для этого набора из трех, а затем расшифровать, используя каждый из трех паролей, чтобы в итоге получить исходный ключ. Затем вы можете использовать это для восстановления самих данных или просто зашифровать их с помощью (хэша) нового пароля пользователя, чтобы он все еще имел доступ к своим данным.
Однако, когда вы делаете это, вам действительно необходимо использовать стандартный алгоритм шифрования и (в силу строгих предпочтений) стандартную, хорошо известную и тщательно изученную его реализацию.