Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/05/2010, 13:02
Luisus
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
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.