¿No funciona password_verify?

  • Autor Autor Macky25
  • Fecha de inicio Fecha de inicio
M

Macky25

Curioso
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Tengo un problema con la función password_verify() dentro de un código que valida si la contraseña ingresada dentro de un Log In y que la compara con la contraseña ingresada en el registro (la cual ya está ingresada en la base de datos) no funciona. Mostrando un mensaje de error sobre si el usuario y el password están incorrectos.

Según el ejemplo de php.net sobre esta función:

PHP:
<?php

$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'La contrase&ntilde;a es v&aacute;lida!';

} else {
    echo 'La contraseña no es válida.';
}

?>

Funciona correctamente en mi servidor. Pero me di cuenta que empieza con '$BCryptRequires22Chrctee' después de unas letras.

He probado con password_default y con password_bcrypt mediante un ejemplo similar.

PHP:
<?php

$linux = 'skylinux';

$hashe = '$2y$10$4ib8PbBTRqUW5kYItj.aXucwfycL9E2yF0/N3c65ULueCJYXCTSO.';
$hache = '$2y$10$wVmDBXYbfxAGeEKVR4wr7eKpI9jUS48HjmVd7eCbLHSkgh6ESXplK';

if (password_verify($linux, $hashe))
					{
						echo "<font face='arial'><b>FUNCIONA EL PASSWORD DEFAULT</b></font><br><br>";
							};

if (password_verify($linux, $hache))
					{
						echo "<font face='arial'><b>FUNCIONA EL PASSWORD BCRYPT</b></font>";
							};


?>

Funcionan ambos correctamente, pero el problema está en este código:

PHP:
<?php
	session_start();
?>
<?php

		$bd_host = "********"; // Hosting (IP del servidor)
		$bd_usuario = "********"; // Usuario con los permisos root
		$bd_password = "********"; // Contraseña del usuario
		$bd_base = "********"; // Base del usuario

		$conexion = new mysqli($bd_host, $bd_usuario, $bd_password, $bd_base);

	//Convierto las variables ingresadas en el Log In por aquí
	$usuarioingresado = $_POST["usuarioingresado"];
	$passwordingresado = $_POST["passwordingresado"];	

	$sql = "SELECT * FROM usuarios WHERE usuario='$usuarioingresado'";
	$result = mysqli_query($conexion, $sql);
	$row = mysqli_fetch_array($result);

	$password = $row['password'];

	if (password_verify($passwordingresado, $password))
					{
					$_SESSION['loggedin'] = true;
					$_SESSION['usuario'] = $usuario;
									echo "BIENVENIDO ".$_SESSION['usuario'];
				  					echo "<br><br><a href='privado.php'>Secci&oacute;n Exclusiva</a>";
							}else{
								echo "<font face='arial' color='arial'><b>Usuario o Password incorrectos!<b></font><br>";
								echo "<font face='arial' color='arial'>Si no es asi, recarga de nuevo la pagina, es solo un pinshi bug</font><br>";
							};
							
	mysqli_close($conexion);
?>

Ayer durante toda la tarde (enserio) estuve tratando de ubicar el error, que hasta el momento pienso que se encuentra en password_verify. En algunos sitios web dicen que el hash (contraseña encriptada/hasheada) tiene que ir con comillas simples. Con el segundo código que les mostré cuando puse comillas dobles solamente mostraba el password_default. Entonces intente registrando un usuario con password_default pero igual me responde con el error de que el usuario o el password son incorrectos.

Por favor necesito saber que debo hacer, porque el password_verify funciona con el ejemplo del segundo código, pero cuando intento compararlo desde la base de datos, es decir, comparando una contraseña ingresada con la contraseña de la base de datos (con el tercer código) me lanza error.

Agradecería mucho sus respuestas :s !!
 
Y si lo estas encriptando con password_hash al momento del registro?

- - - Actualizado - - -

Y qué te dice o qué error te da?
 
Lo estoy encriptando con PASSWORD_DEFAULT.

El error es que me arroja un mensaje de que el usuario/password están incorrectos. Un mensaje que ya había puesto yo. Pero se supone que no debería aparecer cuando escribo bien el usuario y el password...
 
Lo estoy encriptando con PASSWORD_DEFAULT.

El error es que me arroja un mensaje de que el usuario/password están incorrectos. Un mensaje que ya había puesto yo. Pero se supone que no debería aparecer cuando escribo bien el usuario y el password...

Supongo que te refieres a PASSWORD_DEFAULT como segundo parámetro del password_hash?

Puedes poner un ejemplo de contraseña (ya encriptada) de los que tienes en la DB y su respectivo valor sin encriptar?
El campo dónde guardas la contraseña de qué longitud es?
También si pudieras poner el código dónde se hace el registro.

Saludos.
 
Sí como segundo parámetro:

$usuario = $_POST["usuario"];
$password = $_POST["password"];

$password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO usuarios (usuario, password) ";
$sql.= "VALUES ('$usuario', '$password')";
$rs = mysqli_query($mysqli, $sql) or die ("Error al grabar un mensaje: ".mysql_error);


Aquí solo tomé dos variables dentro de los names en HTML (usuario, password).
El campo donde guardo la contraseña es de 255 caracteres.

Yo había pensado que el campo era demasiado pequeño (tenía 60), así que decidí ampliarlo a 255 (lo recomendable), registré un usuario y apareció todo bien en la base de datos (registrado), pero en el Log In aparece el error de que he escrito mal el usuario/password.
 
Sí, use PASSWORD_DEFAULT como segundo parámetro:

Este es el registro de usuarios...
PHP:
$usuario = $_POST["usuario"];
$password = $_POST["password"];

$password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO usuarios (usuario, password) ";
$sql.= "VALUES ('$usuario', '$password')";
$rs = mysqli_query($mysqli, $sql) or die ("Error al grabar un mensaje: ".mysql_error);

Aquí solo tomé dos variables dentro de los 'names' en HTML (usuario, password).

El campo donde guardo la contraseña es de 255 caracteres.
Yo había pensado que el campo era demasiado pequeño (tenía 60), así que decidí ampliarlo a 255 (lo recomendable), registré un usuario y apareció todo bien en la base de datos (registrado), pero en el Log In aparece el error de que he escrito mal el usuario & password.
 
Pues te debería de funcionar. Checa también los logs a ver si no te está dando algún error. Verifica que la query si te regresa al usuario e imprime la contraseña del registro que encontro y comprueba manualmente si no pasa el password_verify.

Saludos.
 
Ya vi el query, si imprime los datos del mismo usuario, también imprime toda la cadena de la contraseña completa...

Verifiqué todo.

Lo que sinceramente creo que pasa... la contraseña encriptada con bcrypt que alguna vez ha sido impresa en la página (con 'echo') es la que funciona correctamente en el código...

Estaba probando 'encriptando' una contraseña con password default y password bcrypt y con if/else comprobaba ambos. Cuando recargué el archivo en el navegador funcionaba los dos mostrando dos mensajes (que ya había puesto) y que dicen que funciona BCrypt y Default. Extrañamente ahora vuelvo a subir el archivo al servidor y solo reconoce el mensaje de bcrypt...

Esa contraseña (la ya encriptada con bcrypt) la añadí a la base de datos para luego comprobarlas con el LogIn... y Funcionó!

Pero el detalle esta, en que esa contraseña que ingresé anteriormente y que funciona... la había impreso en un código PHP anteriormente:

PHP:
<?php

$password = 'BCRYPT12';

$password = password_hash($password, PASSWORD_BCRYPT);

echo "$password";
?>

Y luego... una vez sacaba que la contraseña sería...

$2y$10$XvFpJgigiEMQY27gXzd4u.TAfoNVje8h0fIu4Tg0bscOkNF0TtTDK

La moví en un código así...

PHP:
<?php

$password = 'BCRYPT12';

$bcrypt = '$2y$10$XvFpJgigiEMQY27gXzd4u.TAfoNVje8h0fIu4Tg0bscOkNF0TtTDK';


if (password_verify($password, $bcrypt))
					{ 
						echo "<font face='arial'><b>FUNCIONA EL PASSWORD BCRYPT</b></font>";
							};
?>

Y cuando cargo el código... funciona password bcrypt (que ya he impreso). Luego lo muevo a la base de datos. Y Funciona correctamente.

Probé dos veces más... y funciona.

Entonces ¿porqué solo inicia la sesión del usuario cuando imprimo la contraseña con password_hash y luego la coloco manualmente en la base de datos? :ambivalence:

Lo siento si fue mucho. 😕 Pero trato de brindar toda la información posible para lograr que me comprendan.
 
Atrás
Arriba