Mostrar al Usuario Su Contraseña
Tengo algunos scripts automatizados que se ejecutan para notificar a los usuarios sobre ciertas actualizaciones de la aplicación, etc... y para uno en particular, necesito poder mostrar a los usuarios su user_login
y su contraseña.
¿Cómo muestro al usuario su contraseña si está encriptada?

Las contraseñas de los usuarios se almacenan en la base de datos como lo que se conoce como un hash
. Los hash
no son reversibles, incluso si conoces el hash y el mecanismo utilizado para crearlo. La única forma de "descifrar" un hash es tomar una contraseña, aplicarle el hash, compararlo con el hash objetivo e intentarlo de nuevo... una y otra vez hasta obtener una coincidencia. Si lo piensas, en realidad no estás descifrando nada. Es simplemente fuerza bruta mediante prueba y error.
La contraseña en texto plano nunca se guarda y no debes intentar guardarla, ya que eso compromete la seguridad del sitio, y como las personas tienden a reutilizar contraseñas, también compromete la seguridad de muchos otros sitios.

Teóricamente, esto podría lograrse guardando la contraseña de un usuario en otro lugar cuando la actualiza.
Ten en cuenta que este tipo de práctica casi nunca es recomendable.
En casi todos los casos, existe un enfoque arquitectónico mejor que hace innecesario poder mostrar contraseñas en texto plano.
Dicho esto, si absolutamente debes hacerlo, así es como podría hacerse:
function wpse_97127_save_passes( $errors, $update, $user )
{
if (
empty( $errors->errors ) &&
! empty ( $_POST['pass1'] )
) {
/* si debes guardarla de forma reversible, al menos no la guardes en texto plano */
$pass = base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
md5(AUTH_KEY),
$_POST['pass1'],
MCRYPT_MODE_CBC,
md5(md5(AUTH_KEY))
)
);
// haz algo con $pass, por ejemplo, guárdala en algún lugar
}
}
add_action( 'user_profile_update_errors', 'wpse_97127_save_passes', 0, 3 );
Lo anterior puede revertirse de la siguiente manera:
$pass_from_db = $wpdb->get_results( /* recupera la contraseña cifrada pero reversible de la base de datos */ );
$pass = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
md5(AUTH_KEY),
base64_decode($pass_from_db),
MCRYPT_MODE_CBC,
md5(md5(AUTH_KEY))
),
"\0"
);
Por favor, no hagas esto en entornos de producción con cuentas de usuarios individuales sin su consentimiento o conocimiento. Eso no solo constituiría una mala práctica, sino también un acto poco ético.
Yo hago lo anterior en exactamente un caso con un rol de usuario específico, cuyas capacidades están limitadas, cuyos nuevos usuarios siempre son configurados por un administrador u otro rol de mayor nivel, y cuya contraseña se comparte con múltiples personas desde el principio.
Y aún así, no me siento bien al respecto.
