Comunidad de diseño web y desarrollo en internet online

MD5 me da difrentes resultados al guardar y en el login.

Citar            
MensajeEscrito el 26 Nov 2011 08:08 am
Saludos amigos. El problema es el siguiente. Tengo dos formularios. Uno para el login y otro para registro. Debo estar encriptando mal las contraseñas, porque ambos formularios me dan resultados de encriptación distintos, por lo que no puedo iniciar sesion. Hasta donde he leído, la forma simple de encriptar es la siguiente:

Código PHP :

$contrasena = md5($contrasena);
Incluso, leí que se podían sumar los métodos:

Código PHP :

$contrasena = md5(sha1($contrasena))
Y bueno, no me resulta. Si pongo "echo" al final de las consultas de ambos formularios, ambos me dan resultados distintos para la misma contraseña.

Login:

Código PHP :

$pass = mysql_real_escape_string ($_POST['password']);
$password = md5($pass);

$consulta = "select id_usuario, password, id_perfil from usuarios 
where 
id_usuario = '". mysql_real_escape_string ($_POST['usuario'])."' and 
password = '{$password}' limit 1 ";

$resultado = mysql_query ($consulta) or die (mysql_error());
$login = mysql_fetch_array ($resultado);
Registro:

Código PHP :

$usuario = mysql_real_escape_string ($_POST['usuario']);
$pass = mysql_real_escape_string ($_POST['password']);

$password = md5($pass);

$sql = ("insert into `usuarios` (usuario, password) 
values ('{$usuario}' , '{$password}'");
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
Tengo la intuición de que el error se encuentra en el login y no en el registro. Cualquier sugerencia o ayuda será bien recibida.

Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 26 Nov 2011 02:38 pm
Ten en cuenta que md5() discrimina entre mayúsculas y minúsculas. Es decir, no genera el mismo hash para DriverOp, que para driverop, que para Driverop.

Por otro lado no es necesario que hagas pasar la cadena ingresada como contraseña por el usuario por la función mysql_real_escape_string() ya que la función md5() destruye la cadena neutralizando cualquier inyección de código SQL.

Ah, y los espacios en blanco también cuentan!.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 26 Nov 2011 10:39 pm
Gracias una vez más DriverOp. No se me había pasado por la mente que mysql_real_escape_string() no fuese necesario al usar md5. Me imagino que al pasarle el real_escape el resultado de la encriptación cambiaba. Así que lo dejé así y funciona de maravilla.

El Login:

Código PHP :

$pass = $_POST['password'];
$password = md5($pass);
$consulta = "select id_usuario, password, id_perfil from usuarios 
where 
id_usuario = '". mysql_real_escape_string ($_POST['usuario'])."' 
and password = '{$password}' limit 1 ";
$resultado = mysql_query ($consulta) or die (mysql_error());
$login = mysql_fetch_array ($resultado);
Y el Registro:

Código PHP :

$usuario = mysql_real_escape_string ($_POST['usuario']);
$pass = $_POST['password'];
$password = md5($pass);
$consulta = ("insert into `usuarios` (id_usuario, password) 
values ( '{$usuario}' , '{$password}' ");
$resultado = mysql_query($consulta) or die (mysql_error());
$datos = @mysql_fetch_array($resultado);
Eso sí, tuve que agregarle un @ a la última línea porque me arrojaba el siguiente error justo en esa línea:

Código HTML :

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in 
Con el @ el error ya no sale y los datos se ingresan.

Mis últimas dos preguntas:
a) ¿A qué se debe ese error?
b) Aún no sé donde editar el post para ponerle SOLUCIONADO.

Gracias DriverOp por la guía.

:cool:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 26 Nov 2011 11:23 pm
Tengo una consulta extra. ¿La encriptación se produce en el servidor, verdad? Si es así, entonces la contraseña viaja sin encriptar. Estuve leyendo un poco en este rato y vi que se podía encriptar con javascript. ¿El md5 de javascript me dará el mismo resultado que el de php? ¿Cómo se podría implementar?

Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 27 Nov 2011 12:30 pm
Efectivamente. Cuando el cifrado lo haces en el servidor, la contraseña viaja en claro.

Md5 es un algoritmo universal y abierto. Si en JS te da algo distinto para una misma frase, entonces está mal implementado (o no es md5) ;).

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 27 Nov 2011 05:07 pm
Ok. Probaré y cuando lo haga bien lo publicaré aquí. Gracias una vez más.

:D

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 28 Nov 2011 04:17 am
Listo. Conseguí hacer la encriptación en el lado del cliente. Lo hice con el md5.js que provee pajhome. Lo pueden googlear ya que no sé si puedo poner links. La implementación no sería más que crear un lindo form:

Código HTML :

<form id="login" name="login" method="post" action="login.php" onsubmit="javascript:MD5()">
usuario <input type="text" name="usuario" />
Contraseña <input type="password" name="password" />
<input type="submit" class="btn" value="ingresar"/>
</form>
Y dentro de head:

Código HTML :

<script type="text/javascript" src="md5.js"></script>
<script type="text/javascript">
function MD5(){
var clave=document.forms["login"].elements["password"].value;
var encriptada = hex_md5(clave);
document.forms["login"].elements["password"].value = encriptada;
document.forms["login"].submit();
}
</script>
Y ya. Tengo mi contraseña encriptada desde el form lista para procesarla en el servidor con php. Pero aquí, después de pasar toda la tarde leyendo, me asaltan los siguientes cuestionamientos:

1. Casi todo el mundo concuerda en que no se debe confiar en el cliente, porque si el usuario desactiva js el sistema deja de funcionar. Por otro lado, podrían eventualmente ver la forma de encriptación. Pensé en incluir la función MD5 en un fichero externo (de hecho, así lo hice en realidad) Sin embargo, de nada sirve si js está desactivado.

2. Por otro lado, si el password llega encriptado, no puedo encriptarlo otra vez en el servidor porque mi php encriptaría la cadena que ya viene encriptada, por lo que me generaría otra cadena y el usuario jamás entraría a su perfil.

3. Pienso que se podría generar quizás un if... else... que compruebe si la contraseña viene encriptada. Si es verdadero, que pase a comprobar la que está en la BD. Si no viene encriptada, entonces que la encripte y después la compare. Para saber si viene encriptada o no, se me ocurre lo más fácil. Que cuente la cantidad de carácteres que trae la cadena. Si son 32, por ejemplo, entonces viene encriptada (tendría que ver la forma que ninguna contraseña creada por un usuario pasara de 30 por ejemplo). De esta forma, podría prevenir que js esté desactivado.

4. ¿Y si dejo de lado la comprobación en js en el cliente e instalo un SSL? Así encriptaría todo lo que sale del navegador y no sería necesario estar encriptando en el cliente, de modo que sólo lo haría en el servidor. Claro está, asumiendo el costo.

5. Y por último, encontré dos cosas. a) Un sitio que ofrece SSL gratis, pero por alguna razón no me da confianza; y b) Un manual para crear mis propios certificados de seguridad, con la desventaja de que el usuario tendría que instalarlos la primera vez que entrara al sitio.

Entiendo que en materia de seguridad toda medida es importante y aunque me esté poniendo paranóico, pienso que no es menor este tema, a tal punto que estoy retrasándome en todo lo demás porque quiero dejar mi sistema de usuarios y la seguridad definidos ahora, antes de seguir avanzando con mi proyecto.

Todos los comentarios son bienvenidos.

Buena Caza y Largas Lunas.
:cool:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 28 Nov 2011 11:25 pm
Listo. Por si a alguien le sirve, dejo el script para determinar si es que la contraseña viene encriptada o no. De más que se puede mejorar el método pero es lo único que se me ocurre.

Código PHP :

$password = $_POST['password'];
$cadena= strlen($password);
if ($cadena !="32") {
   $pass = $password;
   $password = md5($pass);
} else {
   $password = $_POST['password'];
}
Buena Caza y Largas Lunas.

:cool:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.