Foros del Web » Programando para Internet » PHP »

Error haciendo login con contraseña encriptada crypt

Estas en el tema de Error haciendo login con contraseña encriptada crypt en el foro de PHP en Foros del Web. Hola. Estoy haciendo un sistema de usuarios que al registrarlo le hago la encriptación a la contraseña de esta forma: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver ...
  #1 (permalink)  
Antiguo 19/11/2015, 11:01
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Error haciendo login con contraseña encriptada crypt

Hola.

Estoy haciendo un sistema de usuarios que al registrarlo le hago la encriptación a la contraseña de esta forma:

Código PHP:
Ver original
  1. <?php
  2. if(isset($_POST["registrar"])){
  3.     $usuario = $_POST["usuario"];
  4.     $usuario = mysqli_real_escape_string($conexion, $usuario);
  5.  
  6.     $contrasena = $_POST["contrasena"];
  7.     $contrasena = mysqli_real_escape_string($conexion, $contrasena);
  8.     $hashFormat = "$2y$10$";
  9.     $salt = "iusesomecrazystrings22";
  10.     $hashF_and_salt = $hashFormat . $salt;
  11.     $encript_password = crypt($contrasena, $hashF_and_salt);
  12.     $contrasena = crypt($contrasena, $hashF_and_salt);
  13.  
  14.     //Lo envío como $contrasena a la base de datos.
  15. }
  16. ?>

Y luego al hacer el login entrada pues siempre me da error y no logro que coincidan las contraseñas.

Código PHP:
Ver original
  1. <?php
  2. if(isset($_POST["login"])){
  3.     $usuario = $_POST["usuario"];
  4.     $usuario = mysqli_real_escape_string($conexion, $usuario);
  5.  
  6.     $contrasena = $_POST["contrasena"];    
  7.  
  8.     $query_password_e = "SELECT contrasena from usuarios ";
  9.     $query_password_e .= " WHERE usuario = '{$usuario}'";
  10.     $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);
  11.     if($fila = mysqli_fetch_array($buscar_contrasena_e))
  12.     {
  13.         $db_contrasena = $fila['contrasena'];
  14.        
  15.         $input_password = crypt($contrasena, $db_contrasena);
  16.         if($input_password == $db_contrasena){
  17.             echo $input_password."<br>";
  18.             echo $db_contrasena."<br>";
  19.             echo "Coinciden<br>";
  20.         }
  21.         else{
  22.             echo $input_password."<br>";
  23.             echo $db_contrasena."<br>";
  24.             echo "No coinciden<br>";
  25.         }
  26.     }  
  27. }
  28. ?>

Siempre me da que no coindicen, incluso he probado de otras maneras pero nada.

¿Cómo podría solucionarlo? Saludos.
  #2 (permalink)  
Antiguo 19/11/2015, 12:02
Avatar de chronos682  
Fecha de Ingreso: febrero-2004
Ubicación: Tunja - Boyacá - Colombia
Mensajes: 627
Antigüedad: 20 años, 2 meses
Puntos: 69
Respuesta: Error haciendo login con contraseña encriptada crypt

Esto está mal

Código PHP:
Ver original
  1. $input_password = crypt($contrasena, $db_contrasena);

En vez de $db_contrasena tienes que pasarle el mismo $hashF_and_salt que usaste para almacenar la contraseña, la idea es encriptar ambas contraseñas con el mismo sistema para que coincidan.
__________________
Si te gustó la respuesta dale +1

HERNÁN G. SIABATO M.
[email protected]
  #3 (permalink)  
Antiguo 19/11/2015, 12:34
Avatar de AlejandraLara  
Fecha de Ingreso: octubre-2015
Mensajes: 115
Antigüedad: 8 años, 6 meses
Puntos: 19
Respuesta: Error haciendo login con contraseña encriptada crypt

Igual, a partir de php 5.5 esta disponible password_hash y password_verify.
__________________
Si le das el código hecho a alguien nunca va a aprender ni te dará las gracias, si le dices como hacerlo aprenderá y te dará las gracias (algún día).
  #4 (permalink)  
Antiguo 19/11/2015, 15:37
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Cita:
Iniciado por chronos682 Ver Mensaje
Esto está mal

Código PHP:
Ver original
  1. $input_password = crypt($contrasena, $db_contrasena);

En vez de $db_contrasena tienes que pasarle el mismo $hashF_and_salt que usaste para almacenar la contraseña, la idea es encriptar ambas contraseñas con el mismo sistema para que coincidan.
Hola chronos682, creo que incluso antes lo había probado y tampoco me sale, ahora pruebo con esta opcion y tampoco, creo que me estoy haciendo un buen lio.

Código PHP:
Ver original
  1. iif(isset($_POST["login"])){   
  2.     $usuario = $_POST["usuario"];
  3.     $usuario = mysqli_real_escape_string($conexion, $usuario);
  4.  
  5.     $contrasena = $_POST["contrasena"];
  6.     $hashFormat = "$2y$10$";
  7.     $salt = "iusesomecrazystrings22";
  8.     $hashF_and_salt = $hashFormat . $salt;
  9.    
  10.  
  11.     $query_password_e = "SELECT contrasena from usuarios ";
  12.     $query_password_e .= " WHERE usuario = '{$usuario}'";
  13.     $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);
  14.     if($fila = mysqli_fetch_array($buscar_contrasena_e))
  15.     {
  16.         $db_contrasena = $fila['contrasena'];
  17.        
  18.         $input_password = crypt($contrasena, $hashF_and_salt);
  19.         if($input_password == $db_contrasena){
  20.             echo $input_password."<br>";           
  21.             echo $db_contrasena."<br>";
  22.             echo "Coinciden<br>";
  23.         }
  24.         else{
  25.             echo $input_password."<br>";           
  26.             echo $db_contrasena."<br>";
  27.             echo "No coinciden<br>";
  28.         }
  29.  
  30.         if($input_password == $hashF_and_salt){
  31.             echo $input_password."<br>";
  32.             echo $hashF_and_salt."<br>";
  33.             echo $db_contrasena."<br>";
  34.             echo "Coinciden<br>";
  35.         }
  36.         else{
  37.             echo $input_password."<br>";
  38.             echo $hashF_and_salt."<br>";
  39.             echo $db_contrasena."<br>";
  40.             echo "No coinciden<br>";
  41.         }
  42.     }
  43. }

Cita:
Iniciado por AlejandraLara Ver Mensaje
Igual, a partir de php 5.5 esta disponible password_hash y password_verify.
Hola AlejandraLara, he estado haciendo pruebas con las opciones que me explicas sin embargo acabo de ver que el servidor donde alojo la web actual tiene la versión php 5.4

Gracias por vuestra ayuda, ¿alguna otra recomendación o cambio?.

Saludos.
  #5 (permalink)  
Antiguo 19/11/2015, 15:52
Avatar de chronos682  
Fecha de Ingreso: febrero-2004
Ubicación: Tunja - Boyacá - Colombia
Mensajes: 627
Antigüedad: 20 años, 2 meses
Puntos: 69
Respuesta: Error haciendo login con contraseña encriptada crypt

Coloca estos dos echo antes del if y muestras qué imprimen en pantalla:

Código PHP:
Ver original
  1. echo $input_password."<br>";
  2. echo $db_contrasena."<br>";

PD: Acabo de probar tu código y funciona bien. Escribe lo que te reportan esos dos echos que te dije a ver cual es el problema.
__________________
Si te gustó la respuesta dale +1

HERNÁN G. SIABATO M.
[email protected]

Última edición por chronos682; 19/11/2015 a las 16:13
  #6 (permalink)  
Antiguo 19/11/2015, 16:36
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Haciendo la prueba que me dices el resultlado que da creo que es el mismo que me daba antes dentro del if:

Código PHP:
Ver original
  1. if(isset($_POST["login"])){
  2.     $usuario = $_POST["usuario"];
  3.     $usuario = mysqli_real_escape_string($conexion, $usuario);
  4.  
  5.     $contrasena = $_POST["contrasena"];
  6.     $contrasena = mysqli_real_escape_string($conexion, $contrasena);
  7.  
  8.  
  9.     $hashFormat = "$2y$10$";
  10.     $salt = "iusesomecrazystrings22";
  11.     $hashF_and_salt = $hashFormat . $salt;
  12.    
  13.  
  14.     $query_password_e = "SELECT contrasena from usuarios ";
  15.     $query_password_e .= " WHERE usuario = '{$usuario}'";
  16.     $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);
  17.    
  18.     if($fila = mysqli_fetch_array($buscar_contrasena_e))
  19.     {
  20.  
  21.         $db_contrasena = $fila['contrasena'];      
  22.         $input_password = crypt($contrasena, $hashF_and_salt);
  23.  
  24.         echo $input_password."<br>";
  25.         echo $db_contrasena."<br>";
  26.  
  27.         if($input_password == $db_contrasena){
  28.             echo $input_password."<br>";           
  29.             echo $db_contrasena."<br>";
  30.             echo "Coinciden<br>";
  31.         }
  32.         else{
  33.             echo $input_password."<br>";           
  34.             echo $db_contrasena."<br>";
  35.             echo "No coinciden<br>";
  36.         }
  37.  
  38.         if($input_password == $hashF_and_salt){
  39.             echo $input_password."<br>";
  40.             echo $hashF_and_salt."<br>";
  41.             echo $db_contrasena."<br>";
  42.             echo "Coinciden<br>";
  43.         }
  44.         else{
  45.             echo $input_password."<br>";
  46.             echo $hashF_and_salt."<br>";
  47.             echo $db_contrasena."<br>";
  48.             echo "No coinciden<br>";
  49.         }
  50.     }  
  51. }


Código PHP:
Ver original
  1. echo $input_password."<br>";
  2.         echo $db_contrasena."<br>";

Imprimen esto:
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL


Y los de dentro del if

Código PHP:
Ver original
  1. if($input_password == $db_contrasena){
  2.             echo $input_password."<br>";           
  3.             echo $db_contrasena."<br>";
  4.             echo "Coinciden<br>";
  5.         }
  6.         else{
  7.             echo $input_password."<br>";           
  8.             echo $db_contrasena."<br>";
  9.             echo "No coinciden<br>";
  10.         }

Imprimen esto:
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL
No coinciden


Gracias de nuevo.
  #7 (permalink)  
Antiguo 19/11/2015, 16:42
Avatar de chronos682  
Fecha de Ingreso: febrero-2004
Ubicación: Tunja - Boyacá - Colombia
Mensajes: 627
Antigüedad: 20 años, 2 meses
Puntos: 69
Respuesta: Error haciendo login con contraseña encriptada crypt

La que está mal es la de la BD, entonces lo más probable es que hayas definido el campo contrasena en la BD con menos de 60 caracteres y te esté truncando la misma.
__________________
Si te gustó la respuesta dale +1

HERNÁN G. SIABATO M.
[email protected]
  #8 (permalink)  
Antiguo 19/11/2015, 17:13
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Efectivamente, tenía el campo limitado solo a 50 caracteres, ahora después de ampliarlo a 60 todo coincide:

$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC

$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC
$2y$10$iusesomecrazystrings2uXsx3soVejCyS3zaEadMVL WICVz1nTfC
Coinciden

Ahora solo me falta retomar el envío para hacer el login y luego preparar la opción de edición con estos mismos métodos.

Muchas gracias por tu gran ayuda, saludos
  #9 (permalink)  
Antiguo 20/11/2015, 07:13
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Hola de nuevo.

El anterior problema va perfectamente, sin embargo ahora tengo otra duda o error que no logro solucionar.

Si lo hago de esta manera a la hora de editar:

Código HTML:
Ver original
  1. <form method="post" action="inc/confirmar-editar-usuario.php?id=<?php echo $id_usuario; ?>&usuario=<?php echo $usuario;?>" enctype="multipart/form-data" class="form">
  2. <label>Contraseña: </label>
  3.     <input name="contrasena" type="password" class="form-control" value="<?php echo $contrasena; ?>" placeholder="Introduce tu contraseña" required ><br>
  4. <input type="submit" value="Editar" name="editar_usuario" class="submit">
  5. </form>

Aquí en el formulario muestro la contraseña actual encriptada de la base de datos y cuando el usuario la cambia por otro pues la envía y la vuelve a encriptar y todo bien:

Código PHP:
Ver original
  1. $contrasena = $_POST['contrasena'];
  2. //Encripto la contraseña para enviar a la base de datos.
  3.     $hashFormat = "$2y$10$";
  4.     $salt = "iusesomecrazystrings22";
  5.     $hashF_and_salt = $hashFormat . $salt;
  6.     $encript_password = crypt($contrasena, $hashF_and_salt);
  7.     //Fin Encripto la contraseña para enviar a la base de datos.
  8.  
  9.  $query = "UPDATE usuarios SET ";        
  10.         $query .="contrasena = '{$encript_password}' ";      
  11.     $query .="WHERE id_usuario = {$id_usuario} ";
  12.      //print_r($query);          
  13.  
  14.     $editar_usuario_query = mysqli_query($conexion,$query);

Hasta aquí todo bien, pero si el usuario no toca la contraseña se envía la contraseña actual que se muestra en el formulario (encriptada) y claro ya pierde el valor anterior enviando una nueva encriptada.

He probado suponiendo que el campo de la contraseña no se toca o vuelve a estar vacío y así enviaría el antiguo valor a la consulta, pero no me ha servido de nada:

Código PHP:
Ver original
  1. //Si el campo contraseña está vacío busco la anterior contraseña para enviar   
  2.     if(empty($contrasena)){
  3.         echo "Contraseña vacía";               
  4.         $query_password_e = "SELECT contrasena from usuarios WHERE id_usuario = {$id_usuario}";        
  5.         $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);     
  6.         //Si se encuentra la contraseña
  7.         if($fila = mysqli_fetch_array($buscar_contrasena_e))
  8.         {  
  9.             $encript_password = $fila['contrasena'];                   
  10.         }
  11.     }
  12.     //Fin Si el campo contraseña está vacío busco la anterior contraseña para enviar


También lo he intentado creando un campo alternativo, por ejemplo $input_contrasena; (variable sin encriptar que se guarda en la tabla en el campo input_contrasena) y cuando el usuario envíe la contraseña por primera vez al registrarse lo guarde sin encriptar. Luego cuando imprima los datos a la hora de editar lo recoge en el campo contraseña y muestra input_contrasena y así si el usuario no toca dicha contreña vuelve a enviar la contraseña correcta que luego se encriptará, pero claro eso parece que estoy creando de nuevo una contraseña desencriptada y no estoy seguro si es una buena práctica o hay alguna otra solución.

¿Se puede hacer de alguna de estas dos maneras o mejor cambiar a otra alternativa? Espero haberme explicado bien.

Saludos.
  #10 (permalink)  
Antiguo 20/11/2015, 10:08
Avatar de chronos682  
Fecha de Ingreso: febrero-2004
Ubicación: Tunja - Boyacá - Colombia
Mensajes: 627
Antigüedad: 20 años, 2 meses
Puntos: 69
Respuesta: Error haciendo login con contraseña encriptada crypt

En primer lugar quita el value del input en el formulario, no le veo la utilidad de poner la contraseña anterior en el text box, luego en el código php que recibe los datos del formulario debes colocar esto:

Código PHP:
Ver original
  1. if (isset ($_POST['contrasena']) && !empty ($_POST['contrasena']))
  2. {
  3. //aqui todo el código para hacer el cambio de contraseña
  4. }
__________________
Si te gustó la respuesta dale +1

HERNÁN G. SIABATO M.
[email protected]
  #11 (permalink)  
Antiguo 20/11/2015, 13:55
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Hola de nuevo chronos682

De esa forma que dices si me saldría ya que es la que suelo usar más, pero en este formulario la edición irá cargada con la contraseña anterior y otros campos también visibles y rellenos para cambiar, de ahí que lo quiera hacer de la manera que explico arriba poniendo la contraseña anterior en el campo contraseña.

Voy a seguir intentando otras maneras a ver si encuentro o me acerco a lo que busco.

Gracias de nuevo, saludos.
  #12 (permalink)  
Antiguo 20/11/2015, 14:04
Avatar de chronos682  
Fecha de Ingreso: febrero-2004
Ubicación: Tunja - Boyacá - Colombia
Mensajes: 627
Antigüedad: 20 años, 2 meses
Puntos: 69
Respuesta: Error haciendo login con contraseña encriptada crypt

Piensa que al poner la contraseña en el formulario cualquiera la podría ver, así este encriptada lo mejor es evitar todos esas situaciones que puedan volver vulnerable tu página.
__________________
Si te gustó la respuesta dale +1

HERNÁN G. SIABATO M.
[email protected]
  #13 (permalink)  
Antiguo 20/11/2015, 14:33
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Sí, llevas toda la razón.

De todas formas aunque lo vuelva a cambiar y lo ponga no visible puede que tenga que usarlo de la manera que cito en alguna otra ocasión, a ver si puedo aprender a hacerlo así, si es posible claro...

Gracias otra vez
  #14 (permalink)  
Antiguo 26/11/2015, 13:42
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error haciendo login con contraseña encriptada crypt

Hola de nuevo.

Retomo este tema ya que creo que he vuelto a encontrar otra manera de hacer lo que me proponía a última hora.

Por ejemplo probando que si el campo actual de la contraseña es el mismo que la contraseña de la base de datos entonces quiere decir que no se ha tocado nada, por lo tanto no envío en la edición el campo contraseña para no cambiar nada.

Código PHP:
Ver original
  1. if (strcmp($contrasena, $db_contrasena) == 0) {
  2.                 //echo 'Según strcmp las dos cadenas son iguales por lo tanto no se ha cambiado el campo contraseña.';
  3.                 $contrasena_nueva = NULL;
  4.             }

Si al contrario el usuario ha puesto una nueva contraseña entonces si hago la edición con el campo contraseña, quedaría de esta manera.


Código PHP:
Ver original
  1. $contrasena = $_POST['contrasena'];
  2.         $query_password_e = "SELECT contrasena from usuarios WHERE id_usuario = {$id_usuario}";        
  3.         $buscar_contrasena_e = mysqli_query($conexion, $query_password_e);     
  4.         //Si se encuentra la contraseña
  5.         if($fila = mysqli_fetch_array($buscar_contrasena_e))
  6.         {              
  7.             $db_contrasena = $fila['contrasena'];
  8.             //echo "La contraseña de la base de datos es: " . $db_contrasena ;                                     
  9.             if (strcmp($contrasena, $db_contrasena) == 0) {
  10.                 //echo 'Según strcmp las dos cadenas son iguales por lo tanto no se ha cambiado el campo contraseña.';
  11.                 $contrasena_nueva = NULL;
  12.             }
  13.             else {
  14.                 //echo 'Según strcmp las dos cadenas NO son iguales, por lo tanto envío la nueva contraseña';
  15.                 //Encripto la nueva contraseña para enviar a la base de datos.
  16.                 $hashFormat = "$2y$10$";
  17.                 $salt = "iusesomecrazystrings22";
  18.                 $hashF_and_salt = $hashFormat . $salt;
  19.                 $contrasena_nueva = crypt($contrasena, $hashF_and_salt);
  20.                 //Fin Encripto la contraseña para enviar a la base de datos.
  21.                
  22.                 //Hago la edición de la contraseña.
  23.                 $query_editar_contrasena = "UPDATE usuarios SET ";           
  24.                 $query_editar_contrasena .="contrasena = '{$contrasena_nueva}', ";
  25.                 $query_editar_contrasena .="fecha_contrasena = now() ";                  
  26.                 $query_editar_contrasena .="WHERE id_usuario = {$id_usuario} ";            
  27.                 $editar_contrasena_query = mysqli_query($conexion,$query_editar_contrasena);
  28.                 //Fin Hago la edición de la contraseña.            
  29.             }
  30.         }

Así en principio me va bien suponiendo que lo tengo que dejar así como edición o por si alguien me lo pide más adelante. De todas formas la opción más segura y fiable es como bien comenta chronos682 de no mostrar nada en el campo contraseña a la hora de editarla, para eso he decidido hacerlo de otra manera parecida a facebook donde al principio te muestra tres campos vacios donde tienes que completar anterior contraseña, nueva contraseña y repetir nueva contraseña.

Saludos

Etiquetas: contraseña, haciendo, login, mysql, select, usuarios
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 14:15.