Sistema de passwords incrackeables!
El otro día se me ocurrió una idea genial, y como nunca había oído hablar de algo así, ya me ilusionaba con que era el primero. Pero como suele suceder, después de buscar un poco, encontré que ya se le había ocurrido a otro... (f#@!04%&|#@#).
Igualmente como no es algo muy difundido, me pareció buena idea contarlo aca, para ver si se empieza a utilizar un poco más, debido a que creo que es una excelente forma de combatir crackers y ayudar a usuarios al mismo tiempo.

Como seguramente todo administrador entenderá, es complicado enseñar a los usuarios a utilizar passwords fuertes y luego recordarlos. El usuario suele utilizar passwords simples y adivinables, ya sea con diccionarios, ataques por fuerza bruta, rainbow tables o incluso un poco de ingeniería social. El problema es que si los forzamos por software a utilizar paswords complejos (que contengan mayúsculas, minúsculas, caracteres locos, un mínimo de 10 caracteres) y encima los forzamos a cambiarlos cada un cierto período de tiempo (digamos 30 días), lo que sucede es que un password que ponen a las 8 de la mañana, el administrador debe resetearlo a las 10 (con suerte), porque el usuario lo olvidó. Por otro lado, está el clásico password pegado en un post-it en el monitor, visible por todo el mundo.

Por todo esto, la idea que se me ocurrió (y a unos cuantos antes que yo ¬ ¬) es una que permita al usuario utilizar passwords recordables y a su vez hacer que los ataques por fuerza bruta, diccinario o rainbow tables sea imposible. Debido a que todos los ataques citados requieren del factor máquina, calculando passwors y probando hasta acertar, la idea es inutilizar este sistema. Y qué sistema venimos usando para que una máquina (sin interacción humana) haga trabajos automatizados en internet? el querido CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart). Siii esas clásicas letritas torcidas dentro de una imagen, encontrables en la mayoría de los blogs y foros para evitar que spammers dejen comentarios con propagandas por todos lados.
Los CAPTCHA van cambiando en cada intento de ingreso, e imposibles de adivinar por un programa (creo que una versión lograron romper algunos crackers, pero las nuevas no), así que nos brindan la herramienta necesaria para evitar la parte automatizable de un cracker.
El otro elemento que necesitamos es una clave secreta conocida solamente por el usuario. Lo bueno es que esta clave no necesita ser extremadamente fuerte y podría usarse un largo mínimo de 5 o 6 caracteres, algo fácilmente recordable.

El mecanismo sería el siguiente. La pantalla de log-in debe contar con el clásico formulario para que el usuario ingrese su nombre de usuario y clave secreta, pero además tendrá un CAPTCHA generado por el servidor, siempre distinto para cada intento de log-in. El usuario deberá ingresar sus credenciales y además lo escrito en el CAPTCHA. El password enviado puede ser la concatenación de la clave del usuario más el CAPTCHA o bien la clave y el CAPTCHA entrelazados de alguna forma, o incluso un xor entre ambos, el sistema lo elige el programador. Una vez que los datos llegan al servidor, éste conoce la clave y también sabe lo que dice el CAPTCHA (fue el que lo generó), así que necesita hacer el mismo cálculo que el cliente para corroborar si las credenciales son correctas.

Ahora, por qué esto es irrompible de forma automatizada?
El CAPTCHA siempre varía, si usáramos un cracker, éste debería acertar al primer intento, es decir, tiene una sola chance de averiguar el password porque al próximo intento, el password será distinto. Recuerden que el password es una concatenación del secreto conocido por el usuario más el CAPTCHA, por esto, aunque el secreto del usuario no cambie, el password real cambiará en cada intento, es decir, tenemos un sistema One-Time Password (OTP).
La única alternativa que queda a un hacker es averiguar la clave del usuario de forma manual, intentando combinaciones de claves de usuario más CAPTCHA, algo que, si la clave no es adivinable por ingeniería social, es muy difícil de averiguar.

Es importante que presten atención a la diferencia entre clave de usuario y password. El password será la concatenación de la clave de usuario más el CAPTCHA y es lo que se envía al servidor, y por eso es lo que tendrá que averiguar un sistema automatizado. El sistema automatizado no lee CAPTCHAs, así que no sabe cómo armar las combinaciones para hacer las pruebas.

Si bien el método de CAPTCHA por imagen sólo es útil en logins gráficos, también existen proyectos de CAPTCHAs en ascii como asciicaptcha que nos permite utilizar CAPTCHAs en sistemas no gráficos.

Algo que se me ocurre, para agregar seguridad al transmitir las claves para que no viajen de forma plana (si no contamos con una capa segura por debajo como TLS/SSL), es utilizar algún algoritmo de hashing, que calcule el hash del password (osea clave+CAPTCHA) antes de enviarlo. Entonces lo que obtenga un sniffer va a ser siempre algo distinto. Si bien el CAPTCHA es visible por un sniffer, éste no podrá averiguar la clave porque el hash varía completamente con solo modificar algún bit.


Espero que mi explicación los haya convencido, para que si desarrollan algún sistema de autenticación (como para alguna página web), utilicen este sistema para facilitarle la vida a los usuarios (no deberán recordar complejos passwords) y agregar una seguridad extrema a las cuentas de usuario.

Para que no crean que es una idea tan loca, simplemente busquen en google "CAPTCHA authentication" (sin las comillas) y van a encontrar varios ejemplos.

5 comentarios:

Zerial dijo...

Solo me gustaria hacer un aporte. Existen tecnicas como las conocidas "redes neuronals" que nos permiten romper los captchas. Es cosa de generar un script especifico para un tipo de captcha o para un sitio web, el script toma la imagen y la descompone capa por capa, quitando el fondo, el ruido, las lineas que molestan, hasta dejar solo el texto y luego, mediante algun algoritmo, es posible traspasar ese texto a un string.
Como lo que paso en Megaupload;
http://sermone.blogspot.com/2009/01/rompen-el-captcha-de-megaupload-usando.html

Un captcha seguro debe cambiar su tipografia, forma, rotacion, fondo, ruido, etc en cada generacion del mismo, para que sea practicamente imposible diseñar un bot que lo pueda romper.

saludos

d3m4s1@d0v1v0 dijo...

Muchas gracias por el aporte Zerial.
Sabía que habían roto algún tipo de CAPTCHA, por eso lo puse, pero como vos decís, un CAPTCHA bien diseñado debería ser muy difícil de romper, o bien el tiempo que tome romperlo debería ser mayor al tiempo que se espera que un usuario normal tarde en loguearse, generando un nuevo CAPTCHA cada vez que esa cantidad de tiempo expira.

Sebas dijo...

muy grosa tu idea vic!! lastima q te ganaron de mano pero asi y todo me parece muy buena!!
habria q implementarlo usando algun generador de captchas ya hecho...alguno debe haber jeje
un abrazo!

Cisko dijo...

Muy interesante, pero todo sería cuestión de tiempo, como menciona Zerial, ya existe este tipo de proyecto para decodificar captchas, hace tiempo estuve leyendo un poco sobre el tema por un reto hacking (http://retohacking9.elladodelmal.com/) y encontré varias cosas muy interesantes (hasta OCR hechos en PHP), por lo que volvemos a una "seguridad relativa", que no sería mas que agregar un grado de dificultad.

Aca puedes encontrar un proyecto bastante bueno hasta con ejemplos y porcentaje de efectividad:
http://caca.zoy.org/wiki/PWNtcha

Saludos!

d3m4s1@d0v1v0 dijo...

Gracias por la info Cisko!
Imagino que de a poco se va avanzando con el tema de romper CAPTCHAs, pero calculo que éstos iran mejorando. Hay implementaciones que son bastante deficientes y capaz son bastante suceptibles a ser rotas.

Publicar un comentario