Comprobar la contraseña de un usuario

30 mar 2011, 23:11:28
Vistas: 32.1K
Votos: 6

Quiero verificar si un usuario tiene una contraseña específica, así que he estado intentándolo con wp_check_password pero la cuenta que se está comprobando se desconecta y no puede iniciar sesión nuevamente hasta que haya una llamada a wp_check_password en el código.

Investigando en el código, descubrí que establece la contraseña utilizando el nuevo hash. Y además, si estoy usando wp_check_password( 'hola', md5('hola'), 1 );, ni siquiera verifica lo que hay dentro de la base de datos y devuelve true. ¿No es esto un error?

¿Alguna idea de cómo puedo verificar la contraseña del usuario?

0
Todas las respuestas a la pregunta 3
10
14

Tu ejemplo funciona correctamente. Estás verificando si la contraseña hello coincide con el hash de hello - lo cual naturalmente hace.

No lo había pensado bien. Tu ejemplo causa el siguiente problema:

  1. Verificas si hello coincide con el md5 de hello (en lugar del hash del perfil del usuario).
  2. Coincide y entonces WP piensa que es correcto, pero como un hash md5 obsoleto que debe actualizarse.
  3. >3. Vuelve a hashear hello y actualiza al usuario con él, bloqueando su acceso (ya que su contraseña ahora es hello en lugar de lo que fuera antes).

Revisa la función wp_authenticate_username_password() para un ejemplo extenso, pero la idea básica es:

$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);
30 mar 2011 23:23:59
Comentarios

Pero no coincide en todas las circunstancias, que es lo que asumí que era el problema. Por un lado, la función de hash de contraseña es intercambiable, por lo que no necesariamente usa md5 (de hecho, no creo que lo haga por defecto - el predeterminado es phpass).

goldenapples goldenapples
30 mar 2011 23:45:09

@goldenapples no tiene sentido sobreescribir wp_hash_password() y dejar wp_check_password(). ¿La falta de coincidencia del hash simplemente no permitirá que nadie pase la verificación, no? :)

Rarst Rarst
30 mar 2011 23:49:49

Oh, tienes razón. wp_check_password() funcionará de la manera en que lo estabas usando en tu respuesta. Me refería a su pregunta original, verificando 'hello' contra el md5 de 'hello', lo cual fallará a menos que md5 sea el algoritmo realmente usado en wp_hash_password...

goldenapples goldenapples
30 mar 2011 23:55:00

@goldenapples la función nativa wp_hash_password() sí soporta md5 por compatibilidad hacia atrás, vuelve a hashear esas contraseñas al verificarlas. Ahora que lo pienso, este es probablemente el problema en la pregunta original...

Rarst Rarst
31 mar 2011 00:03:01

Sí, si las dos contraseñas proporcionadas coinciden usando md5, wp_check_password restablecerá la contraseña del usuario usando la función de hash actual. Así que en la pregunta original, como las dos contraseñas dadas coincidían, estaba cambiando la contraseña del usuario a "hello"...

goldenapples goldenapples
31 mar 2011 00:05:28

@Rarst ¡Gracias! Esto funciona. Y me preguntaba por qué tengo que proporcionar el hash yo mismo. Está ahí para mantener la compatibilidad hacia atrás, ¿verdad? De lo contrario, solo la contraseña a verificar y el ID hubieran sido suficientes.

Ashfame Ashfame
31 mar 2011 00:08:07

@Ashfame las funciones relacionadas con contraseñas son deliberadamente conectables y muy flexibles, para que las personas puedan construir o integrar esquemas de autenticación alternativos sin muchos problemas.

Rarst Rarst
31 mar 2011 00:11:24

@Rarst ¿Quieres decir que es para hacerlo conectable y no para mantener compatibilidad con versiones anteriores de diferentes hashes?

Ashfame Ashfame
31 mar 2011 00:13:05

@Ashfame solo es compatible con versiones anteriores con md5, porque eso es lo que WordPress usaba en el pasado.

Rarst Rarst
31 mar 2011 00:14:45

@Rarst ¡Sí! Eso es exactamente lo que quise decir. Pensé que tu mención sobre que fuera "pluggable" también tenía que ver con la razón de aceptar el hash mismo como argumento.

Ashfame Ashfame
31 mar 2011 00:41:45
Mostrar los 5 comentarios restantes
2

Puedes obtener la contraseña cifrada del usuario desde la base de datos y compararla con la entrada que deseas verificar usando wp_hash_password().

Para verificar si la contraseña del usuario actual coincide con "hello", prueba esto:

if ( $current_user->user_pass == wp_hash_password( 'hello' ) )
30 mar 2011 23:18:51
Comentarios

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass ) funciona de manera diferente a if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) ) ¡Qué raro! Gracias por tu ayuda.

Ashfame Ashfame
31 mar 2011 00:10:57

Esto es incorrecto. wp_hash_password() aplica (en 2020) una sal aleatoria a la contraseña antes de hacer el hash, por lo que no hay dos llamadas que devuelvan el mismo valor.

O. Jones O. Jones
23 oct 2020 00:07:52
0
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);

$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
    print 'Contraseña coincide.';
}

Créditos a: https://stackoverflow.com/a/37181662

28 may 2022 02:34:45