Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2015, 07:08
Avatar de NueveReinas
NueveReinas
 
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 11 años, 2 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