entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Como descifrar una contraseña con password_verify

Buenas, comunidad.

Estoy realizando un login con #jquery #ajax #php y #mysql

Al registrar al usuario, uso la función password_hash que viene por defecto con php y me registra a la perfección. me encripta la contraseña. El problema está cuando intento logearme con esa misma contraseña.

Para intentar logearme, uso la función password_verify que también viene con php, para comparar la contraseña que está enviando el usuario mediante el formulario con la que está en la base de datos. El problema es que me devuelve un "false" aunque la contraseña sea correcta.

Aquí les dejo el código:

Registro
signup.php

class Signup extends Controller {

        public function __construct(){
            parent::__construct();
        }

        public function render() {
            $this->view->render('signup/signup');       
        }   

        public function signup(){
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                header('content-Type: application/json');

                $name = $_POST['name'];
                $lastName = $_POST['lastName'];
                $email = $_POST['email'];
                $pass = $_POST['pass'];
                $options = ['memory_cost' => 1<<10, 'time_cost' => 4, 'threads' => 2];
                $protpass = password_hash('$pass', PASSWORD_DEFAULT, $options);

                if ($this->model->insert(["name" => $name, "lastName" => $lastName, "email" => $email, "protpass" => $protpass])) {

                    echo json_encode('true');
                } else {
                    echo json_encode('false');
                }

            }
        }           

    }

signupmodel.php

class SignupModel extends Model {

        public function __construct() {
            parent::__construct();
        }

        public function insert($datos){

            try {
                $email = $datos['email'];

                $query = $this->db->connect()->prepare("SELECT * FROM user WHERE email = '$email' LIMIT 1");
                $query->execute();
                $fila = $query->fetch(PDO::FETCH_ASSOC);

                if ($fila == 0) {
                    $insert = $this->db->connect()->prepare('INSERT INTO user (name, lastName, email, pass) VALUES (:name, :lastName, :email, :pass)');
                    $insert->execute([
                        'name' => $datos['name'],
                        'lastName' => $datos['lastName'],
                        'email' => $datos['email'],
                        'pass' => $datos['protpass']
                    ]);
                    // return $insert;
                    return true;
                } 
            } catch (PDOException $e) {
                // return false;
                echo $e->getLine();
                echo $e->getMessage();
            }
        }
    }

y, a partir de aquí, código para el login

login.html

<form class="form-signin" id="myFormulario">
  <div class="text-center mb-4">
    <h1 class="h3 mb-3 font-weight-normal">Login</h1>
  </div>

  <div class="form-label-group">
    <input type="email" id="email" class="form-control" placeholder="Email address" required autofocus>
    <label for="emial">Email address</label>
  </div>

  <div class="form-label-group">
    <input type="password" id="pass" class="form-control" placeholder="Password" required>
    <label for="pass">Password</label>
  </div>

  <div class="checkbox mb-3">
    <label>
      <input type="checkbox" value="remember-me"> Remember me
    </label>
  </div>
  <button class="btn btn-lg btn-primary btn-block" id="log">Sign in</button>
  <p class="mt-5 mb-3 text-muted text-center">&copy; 2017-2019</p>
</form>

login.php //este es mi controlador, donde realizo algunas validaciones antes de hacer la consulta a la base de datos

class Login extends Controller {

        public function __construct() {
            parent::__construct();
        }

        public function render(){
            $this->view->render('login/login');
        }

        public function login(){

            if (!empty($_POST['email']) and !empty($_POST['pass'])) {

                if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                    header('content-Type: application/json');

                    $email = $_POST['email'];
                    $pass  = $_POST['pass'];

                    if ($this->model->getUser(["email" => $email, "pass" => $pass])) {

                    } 
                }
            } else {

            }

        }
    }

loginmodel.php //aquí realizo la consulta a la base de datos y compruebo el email y el password


class LoginModel extends Model {
        public function __construct(){
            parent::__construct();
        }

        public function getUser($data){

            try {

                $pass = $data['pass'];
                $json = array();

                $query = $this->db->connect()->prepare("SELECT name, lastName, email, pass FROM user WHERE email = :email LIMIT 1");
                $query->execute(['email' => $data['email']]);
                $row = $query->fetch(PDO::FETCH_ASSOC);
                $pass2 = password_verify($pass, $row['pass']);

                echo json_encode($pass2);           

            } catch (PDOException $e) {
                echo $e->getMessage();
                echo $e->getLine();

            }
        }
    } 

De ante mano, gracias por su ayuda...

1 Respuesta

1voto

magarzon Puntos30650

Estás pasando el string '$pass' en lugar de la variable pass en el controller Signup:

$protpass = password_hash('$pass', PASSWORD_DEFAULT, $options);

Tendría que ser:

$protpass = password_hash($pass, PASSWORD_DEFAULT, $options);

0voto

jhossmer comentado

Claro, en el insert paso $protpass. El problema es en el login

1voto

magarzon comentado

No te has enterado.

Al registrar, no estás almacenando el hash de la password, estás almacenando el hash de la cadena '$pass'. Por eso luego en el login no te valida, porque en el login sí estás pasando correctamente la variable con la password que el usuario introduce, pero la que está guardada (bueno, su hash), es '$pass'

0voto

jhossmer comentado

@magarzon gracias amigo. si era eso

Como para dar el tema por cerrado o que ya solucione el problema?

0voto

jhossmer comentado

@magarzon otra pregunta: ¿esta es la mejor forma para encriptar una contraseña o existen otras maneras mucho mejores?

0voto

Peter comentado

@jhossmer puedes darle un voto a su respuesta y seleccionarla como respuesta correcta.

Para otras dudas, por favor abre otras preguntas.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta