Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] al guardar mi contraseña encriptada no loguea

Estas en el tema de al guardar mi contraseña encriptada no loguea en el foro de PHP en Foros del Web. Saludos colegas tengo un sistema para recordar contraseña mediante correo, todo funciona muy bien hasta cuando guardo la contraseña encriptada y en mi bd. ejemplo ...
  #1 (permalink)  
Antiguo 03/06/2018, 16:03
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
al guardar mi contraseña encriptada no loguea

Saludos colegas

tengo un sistema para recordar contraseña mediante correo, todo funciona muy bien hasta cuando guardo la contraseña encriptada y en mi bd.
ejemplo (1234)
en mi bd la guarda asi:

Código HTML:
Ver original
  1. $2y$10$5JuRPPJOjZ4l8zl7Vo9BHe2wN5mu5M44H5vxYBKRRMtervABBUhSO

pero al momento de loguear de nuevo esta contraseña ya no la reconoce el sistema.

este es mi guardar contraseña.

Código PHP:
Ver original
  1. <?php
  2.    
  3.     require 'conexion.php';
  4.     require 'funcs.php';
  5.    
  6.    
  7.     $id = $conexion->real_escape_string($_POST['id']);
  8.     $token = $conexion->real_escape_string($_POST['token']);
  9.     $password = $conexion->real_escape_string($_POST['password']);
  10.     $con_password = $conexion->real_escape_string($_POST['con_password']);
  11.    
  12.     if(validaPassword($password, $con_password))
  13.     {
  14.        
  15.         $pass_hash = hashPassword($password);
  16.        
  17.         if(cambiaPassword($pass_hash, $id, $token))
  18.         {
  19.         //  echo "Contrase&ntilde;a Modificada <br> <a href='/login.php' >Iniciar Sesion</a>";
  20.             echo"<script type=\"text/javascript\">alert('Password modificado correctamente. '); window.location='/login.php';</script>";
  21.             } else {
  22.            
  23.             echo "Error al modificar contrase&ntilde;a";
  24.            
  25.         }
  26.        
  27.         } else {
  28.        
  29.         echo 'Las contrase単as no coinciden';
  30.        
  31.     }
  32.    
  33. ?>

alguien tiene idea de que pasa?
muchas gracias por sus amables comentarios
  #2 (permalink)  
Antiguo 03/06/2018, 17:40
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: al guardar mi contraseña enciptada no loguea

no se como la estas encriptando pues no lo colocas, y tampoco veo como la estas validado, pero podrías probar de esta manera:

Código PHP:
Ver original
  1. if(password_verify($clave, $almacenada) ){
  2.             //Continuo con el login
  3.         }else{
  4. //cancelo el login
  5. }
__________________
[email protected]
HITCEL
  #3 (permalink)  
Antiguo 04/06/2018, 09:47
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña enciptada no loguea

Cita:
Iniciado por xfxstudios Ver Mensaje
no se como la estas encriptando pues no lo colocas, y tampoco veo como la estas validado, pero podrías probar de esta manera:

Código PHP:
Ver original
  1. if(password_verify($clave, $almacenada) ){
  2.             //Continuo con el login
  3.         }else{
  4. //cancelo el login
  5. }

saludos xfxstudios y gracias por responder aqui tengo la funcion, lo estoy trabajando com has_password

Código PHP:
Ver original
  1. function verificaTokenPass($user_id, $token){
  2.        
  3.         global $conexion;
  4.        
  5.         $stmt = $conexion->prepare("SELECT activacion FROM registro WHERE id = ? AND token_password = ? AND password_request = 1 LIMIT 1");
  6.         $stmt->bind_param('is', $user_id, $token);
  7.         $stmt->execute();
  8.         $stmt->store_result();
  9.         $num = $stmt->num_rows;
  10.        
  11.         if ($num > 0)
  12.         {
  13.             $stmt->bind_result($activacion);
  14.             $stmt->fetch();
  15.             if($activacion == 1)
  16.             {
  17.                 return true;
  18.             }
  19.             else
  20.             {
  21.                 return false;
  22.             }
  23.         }
  24.         else
  25.         {
  26.             return false;  
  27.         }
  28.     }
  29.    
  30.     function cambiaPassword($password, $user_id, $token){
  31.        
  32.         global $conexion;
  33.        
  34.         $stmt = $conexion->prepare("UPDATE registro SET password = ?, token_password='', password_request=0 WHERE id = ? AND token_password = ?");
  35.         $stmt->bind_param('sis', $password, $user_id, $token);
  36.        
  37.         if($stmt->execute()){
  38.             return true;
  39.             } else {
  40.             return false;      
  41.         }
  42.     }

el problema viene al digitar la nueva contraseña si yo pongo 123456 no me carga la nueva contraseña cambiada pero si por ejemplo copia todo el token
$2y$10$5JuRPPJOjZ4l8zl7Vo9BHe2wN5mu5M44H5vxYBKRRMt ervABBUhSO , con este si inicio sesion normalmente

me podrías hacer una explicación pequeña de como es que debe encriptar.

osea el sistema toma los campos de contraseña y repetir contraseña de ahi que hace?

Última edición por dairo65; 04/06/2018 a las 10:33
  #4 (permalink)  
Antiguo 04/06/2018, 12:00
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: al guardar mi contraseña encriptada no loguea

Un sistema de contraseña por hash consiste básicamente en lo siguiente:

1. Al inicio, obtienes el hash de la contraseña y guardas dicho hash en la base de datos, digamos que tu contraseña es 123, el hash es h87f5yh8437h (es un ejemplo no real) y ésto es lo que guardas en la base de datos

2. Cuando el usuario quiere entrar, debe digitar 123, entonces en tu código generas el hash, te debería dar h87f5yh8437h

3. Comparas el hash generado contra el que tienes almacenado en la base de datos, si es igual el login es correcto.
  #5 (permalink)  
Antiguo 04/06/2018, 13:38
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña encriptada no loguea

Cita:
Iniciado por ocp001a Ver Mensaje
Un sistema de contraseña por hash consiste básicamente en lo siguiente:

1. Al inicio, obtienes el hash de la contraseña y guardas dicho hash en la base de datos, digamos que tu contraseña es 123, el hash es h87f5yh8437h (es un ejemplo no real) y ésto es lo que guardas en la base de datos

2. Cuando el usuario quiere entrar, debe digitar 123, entonces en tu código generas el hash, te debería dar h87f5yh8437h

3. Comparas el hash generado contra el que tienes almacenado en la base de datos, si es igual el login es correcto.
aaa claro ahora entiendo mucho mejor, osea que en este caso yo debo poner lo que tu me dices en la hoja de inicio de sesion en osea en mi login.php.

por que en mi codigo solo esta un inicio de sesion normal asi:

Código PHP:
Ver original
  1. $result = mysql_query("SELECT * FROM registro WHERE email = '" . $_POST['email'] . "'
  2.             AND password = '" . $_POST['password'] . "' ");
y aqui es donde debo poner tu codigo?
Código PHP:
Ver original
  1. if(password_verify($clave, $almacenada) ){
  2.             //Continuo con el login
  3.         }else{
  4. //cancelo el login
  5. }
estoy en lo cierto?
  #6 (permalink)  
Antiguo 04/06/2018, 15:14
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: al guardar mi contraseña encriptada no loguea

Código PHP:
Ver original
  1. $result = mysql_query("SELECT * FROM registro WHERE email = '" . $_POST['email'] . "'
  2.                AND password = '" . $_POST['password'] . "' ");

Lo adecuado sería

Código PHP:
Ver original
  1. $result = mysql_query("SELECT * FROM registro WHERE email = '" . $_POST['email'] . "'  ");

Con esto, primero verificas si existe el usuario.

Luego, comparas el hash de la contraseña que haya tecleado el usuario con la que ya tienes en la tabla

Código PHP:
Ver original
  1. if($hash!=$row['password'])
  2.    //Login incorrecto
El uso de una función para hacer la verificación ya dependería de ti, aunque en lo personal no le veo mucho sentido.


Ah, y no olvides que debes sanitizar los datos de entrada, hacer una consulta así directamente puede permitir la inyección de código (sql injection)
  #7 (permalink)  
Antiguo 04/06/2018, 17:17
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña encriptada no loguea

saludos

con lo que me dices de sanitizar es de pasarlo a mysqli?

asi lo deje
Código PHP:
Ver original
  1. mysqli_select_db($conexion,"registro");
  2.      mysqli_query($conexion, "SET CHARACTER SET utf8");
  3.  $result = "SELECT * FROM registro WHERE email = '" . $_POST['email'] . "' AND password = '" . $_POST['password'] . "' ";
  4.        
  5.  $result = $conexion->query($result);
por otro lado no te he dado con el chiste del password que va en la variable $hash?
  #8 (permalink)  
Antiguo 04/06/2018, 17:35
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: al guardar mi contraseña encriptada no loguea

Mysqli es sólo la versión actualizada de mysql.

Sigue siendo necesario sanitizar los datos de entrada, ya sea mediante consultas preparadas o bien mediante el uso de funciones como mysql_real_escape_string.


Por otra parte, como ya te indiqué:
Código PHP:
Ver original
  1. $result = "SELECT * FROM registro WHERE email = '" . $_POST['email'] . "' AND password = '" . $_POST['password'] . "' ";

Esta condición nunca se va a dar, salvo que dentro de la variable $_POST['password'] guardes el hash de la contraseña, y sólo funcionará si el usuario mete bien el usuario y la contraseña, si se equivoca en alguno no sabrás en cuál de los dos datos se equivocó.

1. Consulta los datos del usuario, si no existe el usuario devuelves el error, si existe, vas al paso 2
Código PHP:
Ver original
  1. if(!mysql_num_rows($result = mysql_query("SELECT * FROM registro WHERE email = '" . $_POST['email'] . "'  "))
  2.         die("No existe el usuario");

2. Obtienes el hash del password, no he leído detalladamente cómo lo haces, pero impleméntalo en este paso:
Código PHP:
Ver original
  1. $hash=obtenerHash($_POST['password']);

3. De la fila de datos obtenida de la tabla de usuarios compara la columna del hash del password guardado con el hash nuevo:
Código PHP:
Ver original
  1. if($hash!=$row['password'])
  2.     die('Error password incorrecto');
  #9 (permalink)  
Antiguo 05/06/2018, 06:46
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: al guardar mi contraseña encriptada no loguea

Podrías generar las claves con una funcion así:

Código PHP:
Ver original
  1. function claveusuario($X){
  2.         $salt = substr(base64_encode(openssl_random_pseudo_bytes('30')), 0, 22);
  3.         $salt = strtr($salt, array('+' => '.'));
  4.         $hash = crypt($X, '$2y$10$' . $salt);
  5.         $claveB = $hash;
  6.         return $claveB;
  7.     }

Luego comparar la clave sería algo como:

Código PHP:
Ver original
  1. $db = new mysqli("host", "usuario", "clave", "base");
  2.  
  3. $usuario = $db->real_escape_string($_POST['usuario']);
  4. $clave = $db->real_escape_string($_POST['clave']);
  5.  
  6.  
  7. $a = $db->query("SELECT * FROM tabla WHERE usuario = '$usuario'");
  8. $count = mysqli_num_rows($a);
  9.  
  10.  
  11. if($count===1){
  12.     $row = $a->fetch_object();
  13.  
  14.     if(password_verify($clave, $row->clave)){
  15.         //Resto de tu codigo
  16.     }else{
  17.         //codigo de error
  18.     }
  19. }
  20.     $a->close();
  21.  
  22. $db->close()


Recuerda utilizar MySQLI `para evitarte problemas con las últimas versiones de PHP y así estar al día, tambien para mantener la seguridad de tus datos.
__________________
[email protected]
HITCEL
  #10 (permalink)  
Antiguo 11/06/2018, 14:45
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña encriptada no loguea

saludos y me disculpo por no poder contestar antes ya que he tenido mucho trabajo.

bueno lo modifique y lo deje asi pero no me carga mi sesion no se es que estoy haciendo mal.

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. class Usuarios{
  5.    
  6.     public function __construct(){  }
  7.    
  8.     public function login_in(){
  9.  
  10.  
  11.  
  12.      $conexion = mysqli_connect("localhost","root","","myopen");
  13.      mysqli_select_db($conexion,"registro");
  14.      mysqli_query($conexion, "SET CHARACTER SET utf8");
  15.  
  16.  
  17.  
  18. $email = $conexion->real_escape_string($_POST['email']);
  19. $password = $conexion->real_escape_string($_POST['password']);
  20.  
  21.  
  22.  
  23.  
  24.  $a = $conexion->query("SELECT * FROM registro WHERE email = '$email' ") or die ("no existe correo");
  25.  
  26. $count = mysqli_num_rows($a);
  27.  
  28.  
  29. if($a===1){
  30.     $row = $a->fetch_object();
  31.    
  32.  if(password_verify($password, $row->password)){
  33.         //Resto de tu codigo
  34.    
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.        
  44.         if($row=mysqli_fetch_array($result)){
  45.  
  46.             $_SESSION["id"] = $row["id"];
  47.             $_SESSION["horaAm"] = $row["horaAm"];
  48.             $_SESSION["horaPm"] = $row["horaPm"];
  49.             $_SESSION["HoraA"] = $row["HoraA"];
  50.             $_SESSION["HoraP"] = $row["HoraP"];
  51.             $_SESSION["diaA"] = $row["diaA"];
  52.             $_SESSION["diaC"] = $row["diaC"];
  53.         $_SESSION["email"] = $row["email"];
  54.         $_SESSION["ciudad"] = $row["ciudad"];      
  55.             $_SESSION["nombre"] = $row["nombre"];
  56.             $_SESSION["n_empresa"] = $row["n_empresa"];
  57.             $_SESSION["actividad"] = $row["actividad"];
  58.             $_SESSION["dir"] = $row["dir"];
  59.             $_SESSION["tel"] = $row["tel"];
  60.             $_SESSION["password"] = $row["password"];
  61.             $_SESSION["p1"] = $row["p1"];
  62.             $_SESSION["p2"] = $row["p2"];
  63.             $_SESSION["p3"] = $row["p3"];
  64.             $_SESSION["p4"] = $row["p4"];
  65.             $_SESSION["p5"] = $row["p5"];
  66.             $_SESSION["mensaje"] = $row["mensaje"];
  67.          
  68.            
  69.  
  70.              
  71.  
  72.              
  73.            
  74.             $role = $row["privilegio"];
  75.            
  76.             switch($role){
  77.                
  78.                 case 'prem':
  79.                
  80.                     header('location: 1/');
  81.                     break;
  82.  
  83.                
  84.                
  85.                 case 'admin':
  86.                     header('location: admin/star.php');
  87.                     break;
  88.                    
  89.                
  90.                
  91.             }
  92.  
  93. }else{
  94.         //codigo de error/*echo "Usuario no existe en la base de datos...";*/
  95.               echo  "<script type='text/javascript'>alert('Usuario no existe en la base de datos...');window.location.href = '../login.php';
  96.                    </script>";
  97. }
  98.  echo   $a->close();
  99.  
  100. $conexion->close();
  101.  
  102.  
  103.  
  104.  
  105. }
  106. }
  107. }
  108. }  
  109.  
  110.  
  111. ?>

ya no me carga nada se deque la pagina en blanco y en consola si me envia el correo y el pass "123456" y en mi bd esta el password "$2y$10$VN93aZNqspC7mcLKjSFiE.bAHwbWb/49E9.orh6gFjyBqRFKEbXiy".

dios mio alguna idea de que tendré mal?

gracias por sus amables comentarios

Última edición por dairo65; 11/06/2018 a las 15:25
  #11 (permalink)  
Antiguo 11/06/2018, 19:38
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: al guardar mi contraseña encriptada no loguea

primero prubea que las SESSIONES estan siendo iniciadas correctamente, osea si se abre una pagina agregale una
Código PHP:
Ver original
  1. $_SESSION["test"]='123456';

y en la otra pagina
Código PHP:
Ver original
  1. echo $_SESSION["test"]

asi vees si esta correcto,
ahora otra prueba, quita la funcion que encrypta la contraseña, para determinar si los datos son recibidos correctamente puede que no estes recibiendo la contraseña tal cual se registro en tu formulario de registro o en el formulario de login
  #12 (permalink)  
Antiguo 12/06/2018, 17:41
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña encriptada no loguea

Cita:
Iniciado por tuadmin Ver Mensaje
primero prubea que las SESSIONES estan siendo iniciadas correctamente, osea si se abre una pagina agregale una
Código PHP:
Ver original
  1. $_SESSION["test"]='123456';

y en la otra pagina
Código PHP:
Ver original
  1. echo $_SESSION["test"]

asi vees si esta correcto,
ahora otra prueba, quita la función que encripta la contraseña, para determinar si los datos son recibidos correctamente puede que no estes recibiendo la contraseña tal cual se registro en tu formulario de registro o en el formulario de login
saludos y gracias por responder.

si me esta imprimiendo la contraseña correctamente ya que en este string me la muestra correctamente.

Código PHP:
Ver original
  1. echo $password = $conexion->real_escape_string($_POST['password']);

pero el problema viene cuando voy a cargar la session de admin/star.php por ejemplo
ya que digíto email y contraseña y no carga la session solo queda en blanco.

por otro lado estoy tratando de hacer la comparacion de la contraseña encriptada con la mia ejemplo

este es el codigo de verificacion
Código PHP:
Ver original
  1. if(password_verify($password, $row->password)){
aqui digito mi contraseña

123456 la cual me la debería desencriptar en el siguiente código

$2y$10$VN93aZNqspC7mcLKjSFiE.bAHwbWb/49E9.orh6gFjyBqRFKEbXiy

pero el sistema no me reconoce la contraseña encriptada

ahora si copia todo el codigo $2y$10$VN93aZNqspC7mcLKjSFiE.bAHwbWb/49E9.orh6gFjyBqRFKEbXiy en la parte de contraseña este si ingresa normalmente

Última edición por dairo65; 12/06/2018 a las 18:26
  #13 (permalink)  
Antiguo 13/06/2018, 14:28
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: al guardar mi contraseña encriptada no loguea

Cita:
Iniciado por dairo65 Ver Mensaje
saludos y gracias por responder.

si me esta imprimiendo la contraseña correctamente ya que en este string me la muestra correctamente.

Código PHP:
Ver original
  1. echo $password = $conexion->real_escape_string($_POST['password']);

pero el problema viene cuando voy a cargar la session de admin/star.php por ejemplo
ya que digíto email y contraseña y no carga la session solo queda en blanco.

por otro lado estoy tratando de hacer la comparacion de la contraseña encriptada con la mia ejemplo

este es el codigo de verificacion
Código PHP:
Ver original
  1. if(password_verify($password, $row->password)){
aqui digito mi contraseña

123456 la cual me la debería desencriptar en el siguiente código

$2y$10$VN93aZNqspC7mcLKjSFiE.bAHwbWb/49E9.orh6gFjyBqRFKEbXiy

pero el sistema no me reconoce la contraseña encriptada

ahora si copia todo el codigo $2y$10$VN93aZNqspC7mcLKjSFiE.bAHwbWb/49E9.orh6gFjyBqRFKEbXiy en la parte de contraseña este si ingresa normalmente
como te mencione quita todo lo refernte al HASH del password, y compara simplemente si el passsword enviado por formulario COINCIDE con el de la base de datos, eso te lo sugiero por que el error podria estar en otro lado, en el HTML de tu form.

antes de implentar el hASH y la sanitizacion de datos, procura que el sistema funcione. que haga el registro, que haga el LOGIN, y que exista la persistencia de la SESSION, una vez que compruebes ello, recien agrega la encriptacion de password, recien agrega la sanitizacion de datos y ya por ultimo cuando veas que todo funcione recien, puedes probar a la optimizacion de codigo

y tambien dale un vistazo a tus datos agregados a tu BASE DE DATOS de seguro tendras registros duplicados y demas, una tabla de usuarios no puede haber 2 usuarios con la misma email bueno eso depende de como lo diseñaste
  #14 (permalink)  
Antiguo 30/06/2018, 20:27
 
Fecha de Ingreso: abril-2011
Mensajes: 168
Antigüedad: 13 años
Puntos: 5
Respuesta: al guardar mi contraseña encriptada no loguea

muchas gracias a todos por sus amables respuestas, ahora ya lo pude solucionar.

Etiquetas: contraseña, funcion
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 13:10.