Foros del Web » Programando para Internet » PHP »

Problema con login de usuario el hash de la contraseña me da el error

Estas en el tema de Problema con login de usuario el hash de la contraseña me da el error en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/03/2014, 09:45
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 15 años, 6 meses
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.
  #2 (permalink)  
Antiguo 04/03/2014, 10:00
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Problema con login de usuario el hash de la contraseña me da el error

Has probado a imprimir la contraseña ya encriptada, a ver que valor te sale y si realmente es igual a la de la base de datos?

Un saludo
  #3 (permalink)  
Antiguo 04/03/2014, 10:13
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con login de usuario el hash de la contraseña me da el error

Si, ya lo he hecho y esto es lo que me imprime son puros simbolos pero me parecen iguales

esta es la contraseña extraida de la BD ^iƒ��Oq� ��v�Ͱ�����J��a�

y esta la contraseña encriptada para comprobar ^iƒ��Oq� ��v�Ͱ�����J��a�

La verdad ya no se donde más mirar jaja.
  #4 (permalink)  
Antiguo 04/03/2014, 10:17
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Problema con login de usuario el hash de la contraseña me da el error

Me parece que el problema va a estar en la codificación, si en la base de datos si acepta esos símbolos y la que recoges por post no, en la comparación no serán iguales, yo probaría con otro método de encriptación (aunque solo sea como prueba, para ver si es ese el problema), pero creo que los tiros van por ahí.

Un saludo
  #5 (permalink)  
Antiguo 04/03/2014, 10:22
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con login de usuario el hash de la contraseña me da el error

Ahora mismo intento simple md5 sin salt a ver si me funciona

EDIT: con MD5 que devuelve un string sin simbolos ni nada raro funciona bien... pero no puedo encriptar así las contraseñas jaja.

Para ahorrar problemas, consulto lo siguiente es muy inseguro hacer lo siguiente?

tomo la contraseña del formulario que envía el cliente.

La paso por hash('sha256', $pass, $salt) (el salt obviamente en el registro es aleatorio y se guarda en la base de datos, todos los usuarios tienen un salt diferente)

y el resuldato de ese hash lo paso por sha1 para crear una cadena simple sin simbolos y guardo en la base de datos esa cadena.

Luego para el login, tomo el salt de la base de datos. la contraseña enviada por el usuario en el formulario la paso por hash('sha256', $pass, $saltTomadoDeBD) y ese resultado lo convierto en cadena con sha1.

Y esa cadena la comparo con la contraseña de la BD

Si se mantiene la seguridad haciendo eso, pues no tengo problema de hacerlo y creo que será más sencillo porque la cadena de la contraseña en la BD no incluye simbolos raros.

Saludos!

Última edición por matiD; 04/03/2014 a las 10:55

Etiquetas: contraseña, hash, login, mysql, select, sql, usuario, usuarios, variable
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 02:03.