Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema al comparar contraseñas con crypt()

Estas en el tema de Problema al comparar contraseñas con crypt() en el foro de PHP en Foros del Web. Hola de nuevo Estuve leyendo el manual sobre encriptación [para contraseñas] de PHP, y entonces me topé con que MD5 y SHA1 no son seguras ...

  #1 (permalink)  
Antiguo 23/03/2015, 07:08
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Problema al comparar contraseñas con crypt()

Hola de nuevo

Estuve leyendo el manual sobre encriptación [para contraseñas] de PHP, y entonces me topé con que MD5 y SHA1 no son seguras (algo sospechaba), así que me decanté por usar crypt()

He seguido este tutorial y al final he conseguido... algo, digamos.

Os explico más detalladamente:

Cuando un usuario se registra, se produce esto:

Código PHP:
Ver original
  1. function crypt_blowfish($password, $digito = 7) {
  2.         $set_salt = './1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  3.         $salt = sprintf('$2x$%02d$', $digito);
  4.         for($i = 0; $i < 22; $i++)
  5.         {
  6.         $salt .= $set_salt[mt_rand(0, 22)];
  7.     }
  8.     return crypt($password, $salt);
  9.     }
  10.  
  11.     $password_cifrada = crypt_blowfish('$password');
  12.  
  13.     // Inserta los datos en la base
  14.     $stm = $connection->prepare("INSERT INTO usuarios (email,password,fecha_registro,activation_key,validated,ip_registro) " . "VALUES ( ? , ? , ? , '$random_key' , 0, '$ip' )");
  15.     $stm->bind_param("sss",$email,$password_cifrada,$fecha);

Ok, funciona bien, en la base de datos se me crea una contraseña cifrada.

Código PHP:
Ver original
  1. $2x$07$I5.7A714FJHKF.I3EA

El problema viene cuando, al hacer login, debo comprobar que la contraseña ingresada es igual a la contraseña en la base de datos.

Obviamente no puedo crear una encriptación con esa contraseña ingresada y comparar el resultado con la que hay en la DB porque incluye un Salt absolutamente único.

Entonces, he probado a hacer lo siguiente en el login...

Código PHP:
Ver original
  1. //Toma los datos del form de login
  2. $email = $_POST["user"];
  3. $pass = $_POST["pass"];
  4.  
  5. //Donde $pass es lo que se ha ingresado en el form y $password es el nombre de la tabla en la DB
  6. $encript = crypt($pass, $password);
  7.  
  8. $consulta = "SELECT * FROM usuarios WHERE email = '$email' AND password = '$encript' ";
  9.  
  10. $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  11. $datos = mysqli_fetch_array($resultado);

Y entonces intento pasar los datos del resultado por PHP ECHO a un texto.

Código PHP:
Ver original
  1. $email = $datos['email'];
  2. $password = $datos['password'];

Código HTML:
<p>EMAIL: <?php echo $email ?></p>
<p>PASSWORD: <?php echo $password ?></p> 
Pero no, no me muestra nada.

¿Alguien sabe por qué? No entiendo exactamente como comprobar si la contraseña es igual siendo que está encriptada esa manera tan especial.
__________________
¿Te sirvió la respuesta? Deja un +1
  #2 (permalink)  
Antiguo 23/03/2015, 07:24
 
Fecha de Ingreso: junio-2014
Mensajes: 60
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problema al comparar contraseñas con crypt()

Para comparar las contraseñas con la función crypt puedes usar password_verify
http://php.net/manual/es/function.password-verify.php
Un Ejemplo
Código PHP:
Ver original
  1. if(password_verify($password, $db_array['password']))
  #3 (permalink)  
Antiguo 23/03/2015, 07:28
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Problema al comparar contraseñas con crypt()

No me deja editar el post con el código base

Ahora lo he cambiado un poco.

Código PHP:
Ver original
  1. $email = $_POST["user"];
  2. $pass = $_POST["pass"];
  3.  
  4. $consulta = "SELECT * FROM usuarios WHERE email = '$email' AND password = '$pass' ";
  5.  
  6. $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  7. $datos = mysqli_fetch_array($resultado);
  8.  
  9. $email = $datos['email'];
  10. $passwordDB = $datos['password'];
  11.  
  12. $encr = crypt($pass, $passwordDB);

Y entonces paso los datos a HTML:

Código HTML:
<p>EMAIL: <?php echo $email ?></p>
<p>PASSWORD: <?php echo $passwordDB ?></p>
<p>ENCR: <?php echo $encr ?></p> 
Pero $encr me devuelve *0.

__________________
¿Te sirvió la respuesta? Deja un +1
  #4 (permalink)  
Antiguo 23/03/2015, 07:55
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Post eliminado.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.

Última edición por MaNuX0218; 23/03/2015 a las 08:00
  #5 (permalink)  
Antiguo 23/03/2015, 08:02
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Para hacer la comprobación tienes que encriptar el campo contraseña del login y hay verificar si es igual a la registrada en tu DB.

Por ejemplo:

Código PHP:
Ver original
  1. if(crypt($_POST['PASS_LOGIN']) == $row['PASS_DB']){
  2.   // Lo que debe ocurrir si es igual
  3. }else {
  4.   // La contraseña no coincide
  5. }

Espero te sirva.

Saludos.
Gracias por tu respuesta.

En mi caso, sería algo así:

Código PHP:
Ver original
  1. if(crypt($_POST["pass"]) == $datos['password']){
  2.     $incorrecto = "Contraseña SÍ coincide.";
  3. }else {
  4.     $incorrecto = "Contraseña NO coincide.";
  5. }

pero ponga la contraseña encriptada o no-encriptada en el login me aparece Contraseña NO coincide.

Probablemente sea porque la encriptación que yo he hecho en el registro y en el login son diferentes.
En el registro le he asignado parámetros, y cuando comprueba en la condición lo hace sin parámetros...

No se.
__________________
¿Te sirvió la respuesta? Deja un +1
  #6 (permalink)  
Antiguo 23/03/2015, 08:06
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Lo siento e eliminado el post por que era incorrecto, la mejor solución es como comenta boistoc.

Con password_verify() puedes hacer la comprobación.

Ejemplo:

Código PHP:
Ver original
  1. $encriptado_db = $row['PASS_DB'];
  2. if(password_verify($_POST['CAMPO_PASS'], $encriptado_db)){
  3. // la contraseña coincide
  4. }else{
  5. // la contraseña no coincide
  6. }

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #7 (permalink)  
Antiguo 23/03/2015, 08:11
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Lo siento e eliminado el post por que era incorrecto, la mejor solución es como comenta boistoc.

Con password_verify() puedes hacer la comprobación.

Ejemplo:

Código PHP:
Ver original
  1. $encriptado_db = $row['PASS_DB'];
  2. if(password_verify($_POST['CAMPO_PASS'], $encriptado_db)){
  3. // la contraseña coincide
  4. }else{
  5. // la contraseña no coincide
  6. }

Saludos.
Lo he intentado, pero no. No me verifica el hash, por lo visto.

Código PHP:
Ver original
  1. $email = $_POST["user"];
  2. $pass = $_POST["pass"];
  3.  
  4. $consulta = "SELECT * FROM usuarios WHERE email = '$email' AND password = '$pass' ";
  5.  
  6. $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  7. $datos = mysqli_fetch_array($resultado);
  8.  
  9. $email = $datos['email'];
  10. $passwordDB = $datos['password'];
  11.  
  12. $encr = password_verify($pass = $_POST["pass"], $passwordDB);
  13.  
  14. if(password_verify($pass = $_POST["pass"], $passwordDB)){
  15.     $incorrecto = "La contraseña SÍ coincide";
  16. }else{
  17.     $incorrecto = "La contraseña NO coincide";
  18. }

Y en HTML:

Código HTML:
Ver original
  1. <p><?php echo $incorrecto ?></p>
  2. <p>EMAIL: <?php echo $email ?></p>
  3. <p>PASSWORD: <?php echo $passwordDB ?></p>
  4. <p>ENCR: <?php echo $encr ?></p>

Pero no, sigue mostrándome que la contraseña no es válida ya sea poniendo la contraseña en sí o la contraseña encriptada (que saco de la DB desde PHPMyAdmin).

__________________
¿Te sirvió la respuesta? Deja un +1
  #8 (permalink)  
Antiguo 23/03/2015, 08:17
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Antes de nada compruebalo manualmente, así verás si estas cometiendo errores.

Código PHP:
Ver original
  1. $pass_registro = crypt('123456');
  2.  
  3. $campo_login = '123456';
  4.  
  5. if(password_verify($campo_login, $pass_registro)){
  6. echo 'La contraseña es correcta';
  7. }else{
  8. echo 'La contraseña es incorrecta';
  9. }

En la variable $pass_registro y $campo_login introduce una contraseña que supuestamente estara en DB y que introducirá en el campo contraseña al logearse y haces las comprobaciones.

Espero te sirva, saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #9 (permalink)  
Antiguo 23/03/2015, 08:27
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Antes de nada compruebalo manualmente, así verás si estas cometiendo errores.

Código PHP:
Ver original
  1. $pass_registro = crypt('123456');
  2.  
  3. $campo_login = '123456';
  4.  
  5. if(password_verify($campo_login, $pass_registro)){
  6. echo 'La contraseña es correcta';
  7. }else{
  8. echo 'La contraseña es incorrecta';
  9. }

En la variable $pass_registro y $campo_login introduce una contraseña que supuestamente estara en DB y que introducirá en el campo contraseña al logearse y haces las comprobaciones.

Espero te sirva, saludos.
Así sí funciona bien.
En mi caso...

Código PHP:
$pass_registro crypt('123456');
 
$campo_login '123456';
 
if(
password_verify($campo_login$pass_registro)){
$incorrecto 'La contraseña es correcta';
}else{
$incorrecto 'La contraseña es incorrecta';

Código HTML:
Ver original
  1. <p><?php echo $incorrecto ?></p>
  2. <p>PASS REGISTRO: <?php echo $pass_registro ?></p>
  3. <p>CAMPO LOGIN: <?php echo $campo_login ?></p>

Me aparece:

Código HTML:
La contraseña es correcta
PASS REGISTRO: $1$spiZ6tk2$ao.btObCNgFCAj/7VYzBz/
CAMPO LOGIN: 123456
Pero me parece que el error está en que yo, al registrarse, le añado una Salt y todo eso.
__________________
¿Te sirvió la respuesta? Deja un +1
  #10 (permalink)  
Antiguo 23/03/2015, 08:32
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

En el ejemplo que yo te e puesto seria $pass_registro la que esta almacenada en la DB y $campo_login la contraseña que se introduce al logearse.

En el registro simplemente tienes que encryptarla tal como la escriben sin añadirle nada, ya que cuando intenten logearse lo introduciran de la misma manera que se registro.

Espero se entienda.

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #11 (permalink)  
Antiguo 23/03/2015, 08:34
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
En el ejemplo que yo te e puesto seria $pass_registro la que esta almacenada en la DB y $campo_login la contraseña que se introduce al logearse.

En el registro simplemente tienes que encryptarla tal como la escriben sin añadirle nada, ya que cuando intenten logearse lo introduciran de la misma manera que se registro.

Espero se entienda.

Saludos.
Gracias por las respuestas tan rápidas.

Sí, por supuesto, entiendo. Entonces, voy a probar eliminando del registro las Salt... Pero me resulta raro que no se pueda verificar sencillamente... No se.

__________________
¿Te sirvió la respuesta? Deja un +1
  #12 (permalink)  
Antiguo 23/03/2015, 08:40
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema al comparar contraseñas con crypt()

Que versión de php estas manejando ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #13 (permalink)  
Antiguo 23/03/2015, 08:51
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por hhs Ver Mensaje
Que versión de php estas manejando ?
PHP Version 5.5.21

_________________

Sigue dándome error aunque ponga la contraseña que saco desde PHPMyAdmin.

REGISTRO.PHP


Código PHP:
Ver original
  1. $password = $_POST["signup_password"];
  2.  
  3. $password_cifrada = crypt($password);
  4.  
  5.     // Inserta los datos en la base
  6.     $stm = $connection->prepare("INSERT INTO usuarios (email,password,fecha_registro,activation_key,validated,ip_registro) " . "VALUES ( ? , ? , ? , '$random_key' , 0, '$ip' )");
  7.     $stm->bind_param("sss",$email,$password_cifrada,$fecha);

________________

LOGIN.PHP

Código PHP:
Ver original
  1. $email = $_POST["user"];
  2. $pass = $_POST["pass"];
  3.  
  4. //Conecta a la BD y comprueba si es correcto
  5. $consulta = "SELECT * FROM usuarios WHERE email = '$email' AND password = '$pass'";
  6.  
  7. $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  8. $datos = mysqli_fetch_array($resultado);
  9.  
  10. $passwordDB = $datos['password'];
  11.  
  12. //$incorrecto = $datos["password"];
  13.  
  14. if($datos['email'] != $email or password_verify($pass, $passwordDB) != $pass || $datos['email'] == "" or password_verify($pass, $passwordDB) == "")
  15. {
  16.      $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  17. }
  18. else if ($datos['email'] == $email or password_verify($pass, $passwordDB) == TRUE)
  19. {
  20. // Se inicia la sesión
  21.     $_SESSION['usuario'] = $datos['email'];
  22.     $_SESSION['estado'] = 'Autenticado';
  23.     $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  24.     $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  25.     $stm->execute();
  26. };

Código HTML:
Ver original
  1. <p><?php echo $incorrecto ?></p>
  2. <p>EMAIL: <?php echo $email ?></p>
  3. <p>PASSWORD: <?php echo $passwordDB ?></p>

Y entonces, si intento entrar con mi contraseña normal, no me muestra la contraseña y me dice que es incorrecto.

Si entro con la contraseña encriptada, me dice que los datos son incorrectos PERO me muestra la contraseña.

Código HTML:
El mail o la contraseña son incorrectos. 
Volver y corregir

EMAIL: [email protected]

PASSWORD: $1$Zg8NCuZx$l/HzwWa/SmwUC
__________________
¿Te sirvió la respuesta? Deja un +1
  #14 (permalink)  
Antiguo 23/03/2015, 09:00
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Por que estas comparando si el email no es correto o si la contraseña es correcta, entonces siempre te dira que no es correcto.

Cambialo de esta manera:

Código PHP:
Ver original
  1. if($datos['email'] != $email || !password_verify($pass, $passwordDB)){
  2. $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  3. }

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #15 (permalink)  
Antiguo 23/03/2015, 09:10
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Por que estas comparando si el email no es correto o si la contraseña es correcta, entonces siempre te dira que no es correcto.

Cambialo de esta manera:

Código PHP:
Ver original
  1. if($datos['email'] != $email || !password_verify($pass, $passwordDB)){
  2. $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  3. }

Saludos.
Tiene sentido, no conocía !password_verify ...
Pero sigue sin funcionar.

Cualquiera de las dos contraseñas me las da por incorrectas.

He probado también con:

Código PHP:
Ver original
  1. if($datos['email'] != $email || !password_verify($pass, $passwordDB)){
  2. $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  3. }
  4. else /*if ($datos['email'] == $email or password_verify($pass, $passwordDB) == $passwordDB)*/
  5. {
  6. // Se inicia la sesión
  7.     $_SESSION['usuario'] = $datos['email'];
  8.     $_SESSION['estado'] = 'Autenticado';
  9.     $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  10.     $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  11.     $stm->execute();
  12. };

Es decir, sacándole el else if de la condición, pero tampoco funciona.
No me da por válida ninguna contraseña.

__________________
¿Te sirvió la respuesta? Deja un +1
  #16 (permalink)  
Antiguo 23/03/2015, 09:19
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Vale pues primera vamos a comprobar la contraseña que es lo mas importante y despues el email:

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2. if($datos['email'] != $email){
  3. //el email es incorrecto
  4. }else{
  5. //todo correcto
  6. }
  7. }else{
  8. //la contraseña es incorrecta
  9. }

No se deveria hacer asi, pero es para comprobar que funciona y hace bien las comparaciones.

Pruebalo y dime como te fue.

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #17 (permalink)  
Antiguo 23/03/2015, 09:24
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Vale pues primera vamos a comprobar la contraseña que es lo mas importante y despues el email:

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2. if($datos['email'] != $email){
  3. //el email es incorrecto
  4. }else{
  5. //todo correcto
  6. }
  7. }else{
  8. //la contraseña es incorrecta
  9. }

No se deveria hacer asi, pero es para comprobar que funciona y hace bien las comparaciones.

Pruebalo y dime como te fue.

Saludos.
Teniendo en cuenta que...

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2. if($datos['email'] != $email){
  3.     $incorrecto = "El email es incorrecto";
  4. }else{
  5.     $incorrecto = "Todo OK";
  6. }
  7. }else{
  8.     $incorrecto = "La contraseña es incorrecta";
  9. }

Y...

Código HTML:
Ver original
  1. <p><?php echo $incorrecto ?></p>
  2. <p>EMAIL: <?php echo $email ?></p>
  3. <p>PASSWORD: <?php echo $passwordDB ?></p>

Si pongo la contraseña "tal cual":

Código HTML:
La contraseña es incorrecta

EMAIL: [email protected]

PASSWORD:
(no me muestra ninguna contraseña)

Si pongo la contraseña encriptada (sacada desde PHPMyAdmin):

Código HTML:
La contraseña es incorrecta

EMAIL: [email protected]

PASSWORD: $1$Zg8NCuZx$l/HzwWa/SmwUC
No entiendo qué está mal.
__________________
¿Te sirvió la respuesta? Deja un +1
  #18 (permalink)  
Antiguo 23/03/2015, 09:29
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Comprueba que cuando sacas la contraseña de la DB te muestra la misma en pantalla. Si es así entonces devería funcionarte sin problemas.

Si no, sige lo que te pase anteriormente:

Código PHP:
Ver original
  1. $pass_registro = crypt('123456');
  2.      
  3.     $campo_login = '123456';
  4.      
  5.     if(password_verify($campo_login, $pass_registro)){
  6.     echo 'La contraseña es correcta';
  7.     }else{
  8.     echo 'La contraseña es incorrecta';
  9.     }

Y sigelo comenzando de nuevo a insertar el registro y logearse.

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #19 (permalink)  
Antiguo 23/03/2015, 09:32
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Comprueba que cuando sacas la contraseña de la DB te muestra la misma en pantalla. Si es así entonces devería funcionarte sin problemas.

Si no, sige lo que te pase anteriormente:

Código PHP:
Ver original
  1. $pass_registro = crypt('123456');
  2.      
  3.     $campo_login = '123456';
  4.      
  5.     if(password_verify($campo_login, $pass_registro)){
  6.     echo 'La contraseña es correcta';
  7.     }else{
  8.     echo 'La contraseña es incorrecta';
  9.     }

Y sigelo comenzando de nuevo a insertar el registro y logearse.

Saludos.
Sí, o sea, en HTML muestro el output de la contraseña en la BD.
Es esta línea:

Código HTML:
Ver original
  1. <p>PASSWORD: <?php echo $passwordDB ?></p>

Y efectivamente me muestra la contraseña.

__________________
¿Te sirvió la respuesta? Deja un +1
  #20 (permalink)  
Antiguo 23/03/2015, 09:37
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Entonces si te muestra la contraseña con esta comparación deberias poder acceder o no acceder.

Código PHP:
Ver original
  1. if(password_verify($_POST, $DB)){
  2. // Contraseña correcta
  3. }else{
  4. // Contraseña incorrecta
  5. }
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #21 (permalink)  
Antiguo 23/03/2015, 09:41
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Entonces si te muestra la contraseña con esta comparación deberias poder acceder o no acceder.

Código PHP:
Ver original
  1. if(password_verify($_POST, $DB)){
  2. // Contraseña correcta
  3. }else{
  4. // Contraseña incorrecta
  5. }
Me muestra la contraseña únicamente si es la misma que la que saco de la base de datos post-encriptada. Es decir, me muestra la contraseña si la contraseña es:

Código:
$1$Zg8NCuZx$l/HzwWa/SmwUC
Que es la contraseña asignada en el registro.

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2. // Se inicia la sesión
  3.     $_SESSION['usuario'] = $datos['email'];
  4.     $_SESSION['estado'] = 'Autenticado';
  5.     $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  6.     $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  7.     $stm->execute();
  8. }else{
  9.     $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  10. }

En este caso, cualquiera de las dos contraseñas ("tal cual" o encriptada) me resulta como incorrecta.

Sino, ¿dónde puede estar el error?
__________________
¿Te sirvió la respuesta? Deja un +1
  #22 (permalink)  
Antiguo 23/03/2015, 09:47
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Muestrame esto:

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2.     // Se inicia la sesión
  3.         $_SESSION['usuario'] = $datos['email'];
  4.         $_SESSION['estado'] = 'Autenticado';
  5.         $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  6.         $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  7.         $stm->execute();
  8.     }else{
  9.         $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  10.     }

Con las consultas a la DB para verificar mejor el error.

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #23 (permalink)  
Antiguo 23/03/2015, 09:50
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Muestrame esto:

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2.     // Se inicia la sesión
  3.         $_SESSION['usuario'] = $datos['email'];
  4.         $_SESSION['estado'] = 'Autenticado';
  5.         $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  6.         $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  7.         $stm->execute();
  8.     }else{
  9.         $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  10.     }

Con las consultas a la DB para verificar mejor el error.

Saludos.
Consultas a la DB:

Código PHP:
Ver original
  1.  
  2. $email = $_POST["user"];
  3. $pass = $_POST["pass"];
  4.  
  5. $consulta = "SELECT * FROM usuarios WHERE email = '$email' AND password = '$pass'";
  6.  
  7. $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  8. $datos = mysqli_fetch_array($resultado);
  9.  
  10. $passwordDB = $datos['password'];
__________________
¿Te sirvió la respuesta? Deja un +1
  #24 (permalink)  
Antiguo 23/03/2015, 10:09
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Problema al comparar contraseñas con crypt()

Solo comprobando el email vastaria para despues validar la contraseña

Código PHP:
Ver original
  1.      
  2.     $email = $_POST["user"];
  3.     $pass = $_POST["pass"];
  4.      
  5.     $consulta = "SELECT * FROM usuarios WHERE email = '$email'";
  6.      
  7.     $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  8.     $datos = mysqli_fetch_array($resultado);
  9.      
  10.     $passwordDB = $datos['password'];

Y comprobamos...

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2.         // Se inicia la sesión
  3.             $_SESSION['usuario'] = $datos['email'];
  4.             $_SESSION['estado'] = 'Autenticado';
  5.             $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  6.             $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  7.             $stm->execute();
  8.         }else{
  9.             $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  10.         }

Compruebalo de esta manera, devería funcionarte si en la DB esta todo correcto.

Saludos.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #25 (permalink)  
Antiguo 23/03/2015, 10:19
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Exclamación Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Solo comprobando el email vastaria para despues validar la contraseña

Código PHP:
Ver original
  1.      
  2.     $email = $_POST["user"];
  3.     $pass = $_POST["pass"];
  4.      
  5.     $consulta = "SELECT * FROM usuarios WHERE email = '$email'";
  6.      
  7.     $resultado = mysqli_query($connection, $consulta) or die(mysql_error());
  8.     $datos = mysqli_fetch_array($resultado);
  9.      
  10.     $passwordDB = $datos['password'];

Y comprobamos...

Código PHP:
Ver original
  1. if(password_verify($pass, $passwordDB)){
  2.         // Se inicia la sesión
  3.             $_SESSION['usuario'] = $datos['email'];
  4.             $_SESSION['estado'] = 'Autenticado';
  5.             $incorrecto = "Estás conectado/a como <strong>".$email."</strong> <br><br> <a href='http://www.ejemplo.com/BD/inicio'>Ir al inicio</a>";
  6.             $stm = $connection->prepare("UPDATE usuarios SET ip_ultima='$ip' WHERE email='$email' ");
  7.             $stm->execute();
  8.         }else{
  9.             $incorrecto = "El mail o la contraseña son incorrectos. <br> <a href='javascript:history.back()'>Volver y corregir</a>";
  10.         }

Compruebalo de esta manera, devería funcionarte si en la DB esta todo correcto.

Saludos.
No, lo siento muchísimo por hacerte perder el tiempo, pero tampoco funciona.
Lo mismo de antes;
contraseña "tal cual" = no muestra la contraseña y es incorrecto.
contraseña encriptada = muestra la contraseña pero es incorrecto



p.s.: No hay petición para saber la contraseña encriptada que se encuentra en la BD, entonces, ¿cómo sabe que password_verify($pass, $passwordDB)?
__________________
¿Te sirvió la respuesta? Deja un +1
  #26 (permalink)  
Antiguo 23/03/2015, 10:33
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema al comparar contraseñas con crypt()

Como generaste las contraseñas en la base de datos ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #27 (permalink)  
Antiguo 23/03/2015, 10:37
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por hhs Ver Mensaje
Como generaste las contraseñas en la base de datos ?
Agarro los datos del formulario de registro.

Código PHP:
Ver original
  1. $password = $_POST["signup_password"];

Los encripto:

Código PHP:
Ver original
  1. $password_cifrada = crypt($password);

Y lo envío:

Código PHP:
Ver original
  1. $stm = $connection->prepare("INSERT INTO usuarios (email,password,fecha_registro,activation_key,validated,ip_registro) " . "VALUES ( ? , ? , ? , '$random_key' , 0, '$ip' )");
  2. $stm->bind_param("sss",$email,$password_cifrada,$fecha);
  3. $stm->execute();

Recibo la contraseña correctamente cifrada en mi DB.

__________________
¿Te sirvió la respuesta? Deja un +1
  #28 (permalink)  
Antiguo 23/03/2015, 11:03
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema al comparar contraseñas con crypt()

primero que nada comprobaste que puedes verificar el password sin usar la base de datos?
Cuantos caracteres acepta tu campo password ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #29 (permalink)  
Antiguo 23/03/2015, 11:07
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Problema al comparar contraseñas con crypt()

Cita:
Iniciado por hhs Ver Mensaje
primero que nada comprobaste que puedes verificar el password sin usar la base de datos?
Cuantos caracteres acepta tu campo password ?
Modifiqué el campo password en mi base de datos para que entren hasta 25 caracteres cuando empecé a usar este crypt().
__________________
¿Te sirvió la respuesta? Deja un +1
  #30 (permalink)  
Antiguo 23/03/2015, 11:31
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema al comparar contraseñas con crypt()

Primero antes de usar una función lee el manual, cuando tu utilizar crypt sin salto va utilizar un algoritmo por default por lo cual no sabes de que longitud sera la cadena resultante. Así que lo primero a cambiar es que aceptes mas de 25 caracteres. Cámbialo a 255 y prueba de nuevo
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: contraseñas, fecha, mysql, registro, select, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:49.