Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/03/2014, 09:45
matiD
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 16 años, 1 mes
Puntos: 0
Problema con login de usuario el hash de la contraseña me da el error

Como están?

Tengo un problema no puedo validar bien el login de usuarios me da problemas la contraseña.

El tema es que si valido 2 campos me funciona bien, el problema reside cuando quiero validar con la contraseña del usuario guardada en la BD... parece ser que no son iguales...

Es decir si cambio los parametros para que me compare usuario y nombre, usuario y salt, usuario y mail o lo que sea ingresa bien, pero cuando comparo usuario Y contraseña no hay forma.

Primero les muestro como guardo la contraseña al registrar un usuario
Código PHP:
public function registraUsuario()
    {
        try
        {
            
//Creamos el salt aleatorio para la contraseña de 45 caracteres
            
$this->salt generaSalt::crearSalt(45);
            
            
$this->_passencript hash('sha256'$this->pass$this->salt);
            
            
//Preparamos el query SQL
            
$sql 'INSERT INTO usuarios (usuario, salt, contrasena, nombre, apellido, mail, telefono, tipo_usuario, id_local)'.
                    
'VALUES (?,?,?,?,?,?,?,?,?)';
            
//Creamos la sentencia preparada a utilizar
            
$pre $this->_con->prepare($sql);
            
$pre->bind_param('sssssssii'$this->usuario$this->salt$this->_passencript$this->nombre$this->apellido$this->mail$this->telefono$this->tipousuario$this->idlocal);
            
$pre->execute();
           
            
$this->_con->close();
            
            
$this->success true;
            
            return 
$this->success;
            
        } catch (
Exception $ex) {
            return 
$ex->getMessage();
        }
    
    } 
para empezar la funcion de login de usuario está en la clase Usuario

Código PHP:

    
public function __construct() 
    {
        
//Conectamos a la BD
        
$this->_con = new mysqli(DB_HOSTDB_USUARIODB_PASSWORDDB_DATABASE);
        
        
//Filtramos todos los $_POST
        
$this->usuario filter_input(INPUT_POST'usuario'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->pass filter_input(INPUT_POST'pass'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->confpass filter_input(INPUT_POST'confpass'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->nombre filter_input(INPUT_POST'nombre'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->apellido filter_input(INPUT_POST'apellido'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->telefono filter_input(INPUT_POST'telefono'FILTER_SANITIZE_SPECIAL_CHARS);
        
$this->mail filter_input(INPUT_POST'mail'FILTER_SANITIZE_EMAIL);
        
$this->tipousuario filter_input(INPUT_POST'tipousr'FILTER_SANITIZE_NUMBER_INT);
        
$this->idlocal filter_input(INPUT_POST'localid'FILTER_SANITIZE_NUMBER_INT);
    }    
    
    
//Funcion para login de usuarios
    
public function loginUsuario()
    {
        try
        {
            
//Declaramos variable salt para el bind_result
            
$salt null;
           
            
//Tomamos el salt para la contraseña
            
$sql_salt 'SELECT salt FROM usuarios WHERE usuario = ? LIMIT 1';
            
$this->_salt_stmt $this->_con->prepare($sql_salt);
            
$this->_salt_stmt->bind_param('s'$this->usuario);
            
$this->_salt_stmt->execute();
            
$this->_salt_stmt->bind_result($salt);
            
            if(
$fila=$this->_salt_stmt->fetch())
            {
                
$this->salt $salt;
            }

            
//Cerramos la conexion
            
$this->_salt_stmt->close();
            
            
//Creamos el hash para la contraseña
            
$this->_passencript hash('sha256'$this->pass$this->salt);
            
            
//Consulta de login
            
$sql 'SELECT * FROM usuarios WHERE usuario = ? AND contrasena = ? LIMIT 1';
            
            
//Preparamos la sentencia para el login
            
$this->_stmt $this->_con->prepare($sql);
            
$this->_stmt->bind_param('ss'$this->usuario$this->_passencript);
            
$this->_stmt->execute();
            
$this->_stmt->bind_result($this->idusuario$this->usuario$this->salt$this->pass$this->nombre$this->apellido$this->mail$this->telefono$this->tipousuario$this->idlocal$this->esadmin$this->puntos);
            
            
// Si exsiste el usuario guardamos la sesión
            
if ($this->_stmt->fetch())
            {
                                
                
$_SESSION = array(
                    
'id'=>  $this->idusuario,
                    
'usuario'=>$this->usuario,
                    
'nombre'=>$this->nombre,
                    
'apellido'=>$this->apellido,
                    
'mail'=>$this->mail,
                    
'telefono'=>$this->telefono,
                    
'tipousuario'=>$this->tipousuario,
                    
'idlocal'=>$this->idlocal,
                    
'esadmin'=>$this->esadmin,
                    
'puntos'=>$this->puntos
                
);
                
                
//Cerramos la conexión
                
$this->_stmt->close();
                
                
// Cambiamos el valor de la variable comparadora a Verdadero
                
$this->success true;
                return 
$this->success;
            } 
Bueno si imprimo el salt que tomo de la BD para realizar el hash de la contraseña me lo muestra perfectamente es decir que lo toma bien. Es el mismo salt utilizado para crear la contraseña al momento de crear el usuario. Pero no hay forma no me identifica las contraseñas como iguales. Reitero si cambio el campo a comprobar y pongo usuario y cualquier otro valor de la fila de la Base de Datos, se valida perfecto el usuario y se inicializa la sesion.

Algo que ya probé fue pensar que tenía muy pocos caracteres en la columna contrasena en la BD ya que según había leido "sha256" crea 64 caracteres, así que borre los usuarios creados, y le di un ancho de 100 caracteres para la contraseña volví a crear los usuario, e intentar de nuevo el login y nada...

Bueno a ver si me pueden dar una mano.