A raíz de la aparición de Firesheep, he estado buscando información acerca de la creación de sistemas de login seguros. Me he llevado una gran sorpresa al comprobar que una de las recomendaciones que se hace en alguno de los foros es la de «encriptar» los passwords con MD5 desde Javascript. Son foros de cuyas direcciones no quiero acordarme, pero también en páginas serias se aconseja esta práctica sin explicar las limitaciones de la solución.
Aunque sea muy básico todo esto, voy a explicarlo por si alguien no lo tiene claro.
Un MD5(x) es simplemente una función de hash que transforma cualquier cadena de texto en una ristra de bits que se representa, también, por una cadena de texto. Por ejemplo:
MD5(«hola mundo») = «0ad066a5d29f3f2a2a1c7c17dd082a79»
Por lo que se utiliza en la codificación de contraseñas es porque siempre que a «hola mundo» le aplicas la función, te devuelve la misma ristra de bits.
El método «tradicional» es enviar el password (por ejemplo «hola mundo») al servidor y que allí se le aplique el MD5. Pero, pregunta importante ¿para que aplicar el MD5? Pues para que si alguna vez un hacker consigue acceder a los registros de la base de datos (que suele ser más fácil que acceder al servidor a nivel de usuario o superusuario) no pueda entrar en las cuentas de los usuarios con las contraseñas robadas.
Sabido esto, ¿que pasa si hacemos el MD5 en Javascript antes de enviar la petición? El password del usuario («hola mundo») se convierte en «0ad066a5d29f3f2a2a1c7c17dd082a79» y ‘viaja’ así a través de la red. Si alguien lo captura no verá el password que el usuario ha tecleado, sino el password REAL. ¿Como que el password real? ¿Como puede ser? Ahí está el error de quienes piensan que simplemente por pasar el MD5 en Javascript el sistema de login es más seguro. Enviar la ristra «0ad066a5d29f3f2a2a1c7c17dd082a79» sirve exactamente igual para acceder a la cuenta del usuario que con el sistema anterior enviar «hola mundo», pero con una salvedad: si ahora un hacker consigue leer la base de datos, habrá conseguido TODOS los passwords de los usuarios y podrá suplantarlos a todos.
Conclusión: si te limitas a hacer un MD5 en Javascript, en vez de más seguro, harás tu sistema más inseguro.
Pero, si Yahoo, por ejemplo, utiliza eso del MD5 en Javascript, será que tiene alguna utilidad. Sí, por supuesto. Aparte de quitarte de encima a algún script kiddie, te permite proteger a tus usuarios menos paranoicos, a esos que utilizan para todos los servicios el mismo usuario y la misma clave, ya que la contraseña que utilizan no se llega a transmitir por la red.
Y por último, ¿se pueden combinar ambas ventajas? Por supuesto que sí y es lo que no entiendo como no se explica cada vez que sale a relucir el tema de pasar el MD5. Si calculas el hash MD5 en JS para proteger a tus usuarios del lado de la red, protégelos también del lado del servidor haciendo un doble hash utilizando SHA1 en el servidor (o al revés).
Puedes descargarte una librería para calcular SHA1 y MD5 en javascript desde aquí.
16 respuestas a «MD5, javascript y seguridad»