Показать пользователю его пароль
У меня есть несколько автоматических скриптов, которые уведомляют пользователей об определённых обновлениях приложения и т.д. Для одного из них мне нужно отображать пользователям их user_login
и пароль.
Как показать пользователю его пароль, если он зашифрован?

Пароли пользователей хранятся в базе данных в виде так называемого хэша
. Хэши
необратимы, даже если вам известен сам хэш и механизм его создания. Единственный способ "расшифровать" хэш — это взять пароль, хэшировать его, сравнить с целевым хэшем и повторять процесс снова и снова, пока не будет найдено совпадение. Если задуматься, это вовсе не расшифровка, а просто перебор методом проб и ошибок.
Пароль в открытом виде никогда не сохраняется, и вам не следует пытаться его сохранять, так как это подрывает безопасность сайта. Учитывая, что люди часто используют одни и те же пароли на разных сайтах, это также ставит под угрозу безопасность множества других ресурсов.

Теоретически, это можно реализовать, сохраняя пароль пользователя в другом месте при его обновлении.
Обратите внимание, что такой подход крайне редко рекомендуется.
В подавляющем большинстве случаев существует более правильное архитектурное решение, которое делает ненужным возможность отображения паролей в открытом виде.
Тем не менее, если вам абсолютно необходимо это сделать, вот как это можно реализовать:
function wpse_97127_save_passes( $errors, $update, $user )
{
if (
empty( $errors->errors ) &&
! empty ( $_POST['pass1'] )
) {
/* если вам необходимо сохранить пароль в обратимой форме, по крайней мере не сохраняйте его в открытом виде */
$pass = base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
md5(AUTH_KEY),
$_POST['pass1'],
MCRYPT_MODE_CBC,
md5(md5(AUTH_KEY))
)
);
// сделайте что-нибудь с $pass, например, сохраните его где-нибудь
}
}
add_action( 'user_profile_update_errors', 'wpse_97127_save_passes', 0, 3 );
Вышеуказанный код можно обратить следующим образом:
$pass_from_db = $wpdb->get_results( /* получить зашифрованный, но обратимый пароль из базы данных */ );
$pass = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
md5(AUTH_KEY),
base64_decode($pass_from_db),
MCRYPT_MODE_CBC,
md5(md5(AUTH_KEY))
),
"\0"
);
Пожалуйста, не делайте этого в рабочих средах с учетными записями пользователей без их согласия или ведома. Это не только плохая практика, но и неэтичный поступок.
Я использую вышеописанный подход только в одном конкретном случае для определенной роли пользователя, возможности которой ограничены, новые пользователи которой всегда настраиваются администратором или другой ролью более высокого уровня, и пароль которой изначально известен нескольким людям.
И даже в этом случае я не чувствую себя комфортно.
