Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Encriptar contraseña y comparar para login

Estas en el tema de Encriptar contraseña y comparar para login en el foro de PHP en Foros del Web. Buenas, quería ver si alguien podría darme una mano. Lo que estoy haciendo es un sistema de registro y logueo de usuario, el tema es ...
  #1 (permalink)  
Antiguo 26/11/2013, 19:16
 
Fecha de Ingreso: octubre-2011
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Encriptar contraseña y comparar para login

Buenas, quería ver si alguien podría darme una mano.

Lo que estoy haciendo es un sistema de registro y logueo de usuario, el tema es la encriptacion de la clave.

En el Registro utilice este codigo para encriptar la clave:

Código:
function encriptar($contrasena, $numero = 7){
    $salt = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./';
    $saltc = sprintf('$2y$%02d$', $numero);
    for($i = 0; $i < 22; $i++)
        $saltc .= $salt[ rand(0, strlen($salt)-1) ];
     
    return crypt($contrasena, $saltc);
}
	
	$contrasena = encriptar('$contrasena');
Guardo la contraseña en la base de datos.

Ahora como comparo esa clave guardada con la que coloca el usuario para loguearse luego.

En el logueo el codigo es asi:

Código:
$usuario=$_POST['usuario'];
$contrasena=$_POST['contrasena'];	

$sql="SELECT * FROM tabla WHERE usuario='$usuario'";
	$resultado=mysqli_query($conexion, $sql) or die (mysqli_error());
		if(mysqli_num_rows($resultado)>0){	
			$registro=mysqli_fetch_assoc($resultado);
			$contrasenaencriptada=$registro['contrasena'];
			if(crypt($contrasena, $contrasenaencriptada) == $contrasenaencriptada){
				 echo "Conexion Exitosa";
				$_SESSION['usuario']=$usuario;
				$_SESSION['login_ok']=1;	
			}
			else{
				echo "ERROR";
			}

				 

		}else{
			echo "Error de Conexion, compruebe su usuario y contraseña";
		}
Algo estoy haciendo mal? Desde ya gracias. Y la clave se guarda en la base de datos encriptada o eso parece.
  #2 (permalink)  
Antiguo 26/11/2013, 19:30
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Encriptar contraseña y comparar para login

el problema es que estas comparando peras con manzanas.

Tienes una funciona "encripta" que genera un "salt" aleatorio para "encriptar", por lo tanto, sin saber que salt utilizaste, va a estar muy dificil que generes un hash identico.

Ahora, como dato adicional. No confundas una cadena encriptada, con un hash.

Una contraseña encriptada, se puede revertir.
Una contraseña "hasheada" (no se el termino en español), no se puede revertir.

tu estas utilizando hashes, no estas encriptando.
  #3 (permalink)  
Antiguo 26/11/2013, 20:46
 
Fecha de Ingreso: octubre-2011
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Encriptar contraseña y comparar para login

Hice unos cambios en el codigo y funciona. Pero quisiera saber si es seguro y esta bien.
Al registrarse:

Código:
	// Encriptamos contraseña

    $salt = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./';
    $saltc = sprintf('$2y$%02d$', 7);
    for($i = 0; $i < 22; $i++)
        $saltc .= $salt[ rand(0, strlen($salt)-1) ];
     $salt_contrasena=$saltc;
    $contrasena=crypt($contrasena, $saltc);
Al iniciar Session:

Código:
$usuario=$_POST['usuario'];
$contrasena=$_POST['contrasena'];	

$sql="SELECT * FROM tabla WHERE usuario='$usuario'";
	$resultado=mysqli_query($conexion, $sql) or die (mysqli_error());
		if(mysqli_num_rows($resultado)>0){	
			$registro=mysqli_fetch_assoc($resultado);
			$contrasenaDB=$registro['contrasena'];
			$salt_contrasenaDB=$registro['salt_contrasena'];
			
			
			if(crypt($contrasena, $salt_contrasenaDB) == $contrasenaDB){
				 echo "Conexion Exitosa";
				$_SESSION['usuario']=$usuario;
				$_SESSION['login_ok']=1;	
			}
			else{
				echo "ERROR";
			}

				 

		}else{
			echo "Error de Conexion, compruebe su usuario y contraseña";
		}
Desde ya gracias
  #4 (permalink)  
Antiguo 27/11/2013, 03:27
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Encriptar contraseña y comparar para login

Si aciertas el usuario pero fallas la contraseña, das un error diferente al de si fallas el nombre de usuario. Haz que ambos devuelvan exactamente la misma página de error, o el login servirá para saber si un usuario existe.
  #5 (permalink)  
Antiguo 27/11/2013, 07:40
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Encriptar contraseña y comparar para login

Con respecto a si es seguro, al contraseña en si, puedes considerarla segura. El problema con tu codigo, es que estas utilizando un API deprecada y que tu codigo es vulnerable a inyeccion de SQL.

Con respecto a la API deprecada, no utilizes las funciones mysql_ ya que estas no soportan consultas parametrizadas que son las que evitan la inyeccion de SQL.

Si utilizaras las API de mysqli o de PDO junto con consultas parametrizadas, eliminarias tu riesgo de inyeccion de SQL.

Las consultas parametrizadas, envian la consulta y los parametros por separado, lo que obliga a MySQL a interpretar el SQL original primero, y posteriormente aplicar los parametros.

Por ejemplo tu escribes:

SELECT * FROM tabla WHERE usuario='$usuario'

Sin parametrizar tu consulta, yo puedo cambiar el valor de $usuario a:

alanchavez' OR 1 = 1 --

por lo que tu consulta se convierte en

SELECT * FROM tabla WHERE usuario = 'alanchavez' OR 1 = 1

Si bien no puedo ver todos los usuarios en tu sistema, si puedo utilizar un ataque basado en tiempo para adivinarlos, por lo que tu sistema automaticamente es vulnerable a inyeccion de SQL.

Etiquetas: contraseña, encriptar, login, mysql, registro, select, sql, tabla
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 09:28.