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.