Cómo agregar una capa más de seguridad a un login

Un sistema de inicio de sesión tradicional funciona simplemente enviando, en texto plano, los datos de usuario y password al sistema en php o el lenguaje que sea, el sistema lo recibe, lo encripta y lo compara con la información de la base de datos para saber si es correcto o no. Lo que no está mal, pero deja abierta la posibilida de que alguien este sniffeando la red y capture los datos en bruto (raw) o texto plano.
Como podemos ver en el siguiente esquema:

secure-js1

Una forma que se me ocurrió para que los datos del formulario, especialmente la password, no viajarán en texto plano, fue encriptarla mediante javascript al momento de hacer el submit. De esta forma, cuando el atacante logre capturar los datos lo que verá es una cadena en md5, como aparece en el siguiente gráfico:

secure-js2

Los pros y contras
Este método nos entregará una capa de seguridad dependiente del navegador, obviamente, para que funcione vamos a necesitar un navegador con soporte de javascript y tambien un sistema de login adaptado para recibir un string ya cifrado en md5.
Como puntos a favor, podemos decir que para el atacante (sniffer) será más complicado obtener la clave en texto plano. Si esta persona usa el mismo sistema para autentificarse usando el hash md5 snifeado, el javascript volverá a encriptarlo y cuando lo envie, no va a coincidir con el hash que está en la base de datos.
Como punto en contra, el usuario de todas formas podrá logearse cuando obtenga el hash, con algun script o un login paralelo que no haga la encriptación de la clave pero por otro lado, el atacante nunca podrá saber la password que usa la persona, sólo conocerá su hash el cual no le servirá para ingresar a otros servicios, en el caso que use la misma password para mas de un sistema.
Como punto a favor, este metodo puede dificultarle la tarea a atacantes newbies, que seguramente intentarán logearse una y otra véz con el hash que capturaron preguntandose ¿WTF, que le pasa a esta mierda que no funciona?.

Video demostrativo

httpvh://www.youtube.com/watch?v=P4lyA77DtZY

Links a Youtube: https://www.youtube.com/watch?v=P4lyA77DtZY
Descargar (ogv, 47Mb)

9 comentarios

  1. cool, npi que se podia encriptar en md5 con javascript ^^

  2. Está demás decir que con el uso de jQuery de tu lado puedes lograr mejores encriptaciones usando una key.

    Por ej, usando jQuery Crypt : http://plugins.jquery.com/project/crypt

  3. Zerial

    julio 15, 2009 a las 1:33 am

    @hypn: El problema es que si uso una key, tengo que tener una key para cifrar y descifrar, como es javascript, podría obtener esa “key” entonces descifrar el hash.
    De todas formas, con jquery se puede mejorar mucho esta funcionalidad, pero esto es solo una prueba de concepto

    saludos

  4. Wena zerial, excelente info para los incautos 😉

  5. Está de porno la música de fondo de la demostración me excite.

    Buena info Zerial.

  6. Pero un atacante que te esta sniffeando no es boludo, reconoce un hash y se loguea igual. también puede ver el javascript que vos mandas

    Me parece mejor usar criptografia asimétrica y eso se lo dejo al ssl.

    Igualmente, si lo queres usar te conviene usar un hash mas robusto como sha256

  7. Zerial

    julio 16, 2009 a las 1:26 pm

    @seth: Hola.
    Bueno, esto que publiqué fue mas que nada por la experiencia que he tenido, me he topado en la universidad o en distintos lados que cualquier persona se baja una distribución Live y empieza a sniffear, ni si quiera saben lo que están haciendo.

    Creo que no importa mucho que ellos puedan ver el codigo javascript, porque es un simple algoritmo para encriptar en md5, no tienen ninguna key, salt, ni nada.
    Esto lo pense basicamente para dificultarle la tarea un poco (quizas muy poco) al atacante, cuando este sniffeando simplemente no pueda ver la password en texto plano y tenga que hacer el doble o triple de trabajo para poder desencriptar ese hash.
    Como digo en el articulo, una de las cosas buenas es que el usuario quizas se va a poder logear al sistema con ese hash, pero no va a saber cual es su clave.

    Pensé en hacerlo con SHA, pero esto es solo una prueba de concepto, se puede mejorar mucho.

    saludos

  8. Coincido con @seth, dejas afuera a los más básicos, aunque puede servir mejor que no poner nada.
    Igualmente a partir de leer ésto me puse a pensar en una alternativa mejor, y se me terminó ocurriendo algo bastante bueno, aunque quizás no está tan relacionado con lo que vos queres hacer, depende como lo utilices, podria servir también.
    Espero tu visita y comentario para ver que te parece.
    Saludos

  9. esta bueno, y no muy dificil de hacer

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.