Foros del Web » Programando para Internet » PHP »

Ayuda en autentificación

Estas en el tema de Ayuda en autentificación en el foro de PHP en Foros del Web. Hola qué tal, un saludo a todos y muchas gracias por leer esto. Mi inquietud es la siguiente: En los sitios que he creado usando ...
  #1 (permalink)  
Antiguo 14/05/2010, 13:02
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 3
Ayuda en autentificación

Hola qué tal, un saludo a todos y muchas gracias por leer esto.

Mi inquietud es la siguiente:

En los sitios que he creado usando PHP, he llegado a poner páginas que para acceder a ellas es necesario identificarse.

Cuando el usuario se registra, creo una sal. Después a la contraseña con md5, junto con el usuario y la sal les paso sha1 y luego md5 y esa cadena la guardo en la base de datos junto con el nombre de usuario y su sal. Es decir, algo así:

Código PHP:

// $Usuario y $Pass se obtienen de lo que el usuario introduce.
// $Sal es una cadena de caracteres aleatorios.

$Hash md5(sha1($Usuario.md5($Pass).$Sal));

mysql_query"INSERT INTO BaseDatos (Usuario,Hash,Sal) VALUES ('$Usuario','$Hash','$Sal') " ) ; 
Eso es para crear usuarios, ya cuando el usuario registrado quiere iniciar sesión, accedo a la base de datos para obtener la sal de ese usuario usando su nombre y también el Hash que se generó en su registro. Luego genero un Hash con la información que introdujo, y si coincide con el Hash de su registro, entonces se inicia su sesión, guardando su contraseña con md5 y su usuario como variables de sesión. Algo así:

Código PHP:

// $Usuario y $Pass se obtienen de lo que el usuario introduce.

$Q mysql_query("SELECT * FROM BaseDatos WHERE Usuario = '$Usuario'");

$Sal mysql_result($Q,0,'Sal');
$BDHash mysql_result($Q,0,'Hash');

$LocalHash md5(sha1($Usuario.md5($Pass).$Sal));

if(
$BDHash == $LocalHash)
   {
   
session_start();
   
$_SESSION['Usuario']=$Usuario;
   
$_SESSION['Pass']=md5($Pass);

   echo 
'Sesión iniciada';
   }
else
   {
   echo 
'Datos incorrectos. Vuelve a intentarlo.';
   } 
En páginas posteriores que necesitan de autentificación, abro la sesión y accedo a las variables Usuario y Pass, obtengo datos de ese usuario desde la base de datos y genero un Hash, si este coincide con el que se generó en su registro, se muestra la página, si no, lo manda fuera. De esta forma:

Código PHP:

session_start
();
$Usuario $_SESSION['Usuario'];
$Pass $_SESSION['Pass']; // Aquí el pass ya tiene md5

$Q mysql_query("SELECT * FROM BaseDatos WHERE Usuario = '$Usuario'");

$Sal mysql_result($Q,0,'Sal');
$BDHash mysql_result($Q,0,'Hash');

$LocalHash md5(sha1($Usuario.$Pass.$Sal)); // El pass ya tiene md5

if($BDHash == $LocalHash)
   {
   
//Se muestra la página
   
}
else
   {
   
header'Location: ../iniciarsesion.php' ) ;
   } 

Espero haberme explicado en cómo hago la identificación.

Mis preguntas son las siguientes:

¿Qué tan segura es la autentificación que uso?
Hago esa pregunta porque todo el sistema confía en que un header bote de la página al visitante.

Si el header llegara a fallar, entonces la página se mostraría.


¿De qué extensión recomiendan debería ser la Sal?

Por ahí leí que la sal ayuda mucho y no sé qué tantas cosas. Que la sal debe ser distinta para cada usuario y que esta debe ser larga... pero ¿Qué tan larga?


Bueno, eso es todo por ahora. Si el sistema que uso resulta ser muy seguro, siéntanse libres de implementarlo en sus web, si no lo es, ayúdenme a mejorarlo, después de todo, esto es para mejorar.

Muchas gracias por leer.
  #2 (permalink)  
Antiguo 14/05/2010, 16:15
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 8 meses
Puntos: 66
Respuesta: Ayuda en autentificación

Cita:
Iniciado por Luisus Ver Mensaje

¿De qué extensión recomiendan debería ser la Sal?

Por ahí leí que la sal ayuda mucho y no sé qué tantas cosas. Que la sal debe ser distinta para cada usuario y que esta debe ser larga... pero ¿Qué tan larga?
Si quieres crear un identificador único y dificil de predecir te recomiendo:

$sal = md5(uniqid());

El resto de las preguntas no me arriesgo a contestarlas pues es un tema delicado, pero si el header falla no mostrará la página, en todo caso producirá un error.

Saludos
__________________
Tu álbum de cromos online!!
  #3 (permalink)  
Antiguo 14/05/2010, 16:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: Ayuda en autentificación

Cita:
Iniciado por santris Ver Mensaje
Si quieres crear un identificador único y dificil de predecir te recomiendo:

$sal = md5(uniqid());
Muchas gracias amigo, entonces la longitud de la sal que me recomiendas es de 32 caracteres.

Es bueno saberlo, yo usaba una función que generaba strings aleatorias de la longitud que uno quisiera y usaba 256 como longitud de mi sal...

Creo que exageraba un poco.

Muchas gracias
  #4 (permalink)  
Antiguo 14/05/2010, 16:27
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 8 meses
Puntos: 66
Respuesta: Ayuda en autentificación

Esto dice el manual:

Esto creará un identificador de 32 caracteres (un número hexadecimal de 128 bits) que es extremadamente difícil de predecir.

Saludos
__________________
Tu álbum de cromos online!!
  #5 (permalink)  
Antiguo 14/05/2010, 17:26
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: Ayuda en autentificación

Cita:
Iniciado por santris Ver Mensaje
...si el header falla no mostrará la página, en todo caso producirá un error.
Muchas gracias santris por tu respuesta.

A la "seguridad" que me refiero es que si yo quitara la línea que contiene el header de mi script en PHP, entonces toda la autentificación se viene abajo.

Eso es lo que despertó mi inquietud respecto a la eficiencia de mi sistema, que todo recae en una simple línea. :S

Muchas gracias por tus respuestas.

Etiquetas: autentificar, iniciar, md5, sal, seguridad, sesión
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:11.