miércoles, 26 de enero de 2011

Un poco de seguridad "Salting passwords" sounds yummy

He que rollo! para los que me conocen mas o menos saben que me interesa mucho el tema de la seguridad informática, asi que intento leer lo mas que puedo al respecto y la neta me entretengo, las últimas semanas he tenido la oportunidad de leer unos posts bastante interesantes en Coding Horror (buena pagina la recomiendo!) sobre temas como el desastre en la red de Gawker, me hizo leer sobre una técnica para evitar comprometer los passwords de tus usuarios en caso de que tu DB se vea comprometida, salt your passwords!



Como debemos de saber grabar los password de tus usuarios en texto plano es un ERROR ENORME sin embargo, desde hace años existen alternativas para evitar comprometer los passwords de tus usuarios. La mas conocida (y que yo usé en mis últimos proyecto) consiste en en pasar los passwords de tus usuarios por un algoritmo como MD5 antes de guardarlos. Si recordamos (o si leemos wiki ;P) el MD5 nos proporciona un nivel muy bajo de colisiones. Este algoritmo nos permite entonces convertir un string como un password en otro a partir del cual no se puede reconocer el strin original, la peculiaridad de este algoritmo es que para una string como "mysuperpassword" MD5 siempre arrojará el mismo string de salida, ademas este no es reversible, si tenemos el MD5 de un string es imposible conocer el string original apartir del MD5 es decir:
Si mi password es superpass0 y su hash de MD5 es NF#AGD#78JF& a partir del string "NF#AGD#78JF&" no podemos saber el password original

La idea consiste entonces en pasar todos los passwords de tus usuarios a MD5 antes de almacenarlos en tu DB, de esta manera aunque tu DB sea comprometida los passwords de tus usuarios estaran "seguros" aunque sabemos que en este mundo nada es seguro por mucho tiempo.

Los hackers son listos y nosotros debemos serlo también si queremos ganarles, desde hace años conocía yo sobre los rainbow tables. Para darle vuelta al problema de los hashes y poder obtener los passwords originales, se les ocurrio que era posible computar los hashes de cualquier palabra o combinación de letras posibles digamos de 1 a 10 caracteres y obtener TODOS los haches de esas combinaciones. Como pueden imaginar el numero de hashes de todas las combinaciones de letras y numeros de 1 a 10 caracteres sería millones, bueno en realiada son billones y cuando esta técnica surguió las computadoras no eran tan rápidas como hoy en día, sin embargo, ese no era todo el problema que tenían si no que tal cantidad de hashes creaba archivos de tamaños estratosfericos para la época (hace unos 5 años que se de esto pero he visto posts sobre esto tanto viejos como 2002) por ejemplo todas las combinaciones de letras y numeros de 1 a 14 caracteres ocupan poco mas de 700 Mb, para hoy en día no es mucho, pero si se quería incluir los hashes para caracteres como
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ (including the space character)

con una longuitud de la frase de 14 caracteres la tabla crece hasta 7.5Gb, de esta manera los hackers podían obtener una DB y ver los hashes, luego los comparaban contra sus rainbow tables y obtenían el hash correspondiente y el password del cual venía el hash. Aunque la técnica era un tanto impráctica para su tiempo (aunque para nada imposible) es mas que realizable por casi cualquier persona hoy en día.

Entonces no hay forma de estar seguro? pues la triste realidad de las cosas es que probablemente a lo mas que puedes aspirar es a comprarte algo de tiempo o que con las medidas adicionales que tomes detengas a script kiddies o similares pero no a hackers avanzados, de igual manera no podemos dejar de intentar mejorar nuestra seguridad solo porque esta no es perfecta. Fue entonces que mientras leía este post vi el link hacía un post viejo en el mismo blog (es el de los rainbow tables) sin embargo me percate que el autor mencionaba como mejorar aún mas tu esquema para protegerte de los rainbow tables está tecnica es comunmente llamada "Salt" aunque el autor no parecio comprender bien la implementación de la misma me hizo buscar mas información.

Básicamente esta técnica consiste en lo siguiente.

Nuestro esquema actual es que cuando un usuario se desea autentificar contra nuestro sistema (que usa passwords hasheados) como no sabemos su password en texto plano (porque estan hasheados en MD5) cuando el usuario escribe su password y usuario nuestro sistema busca su usuario en la DB luego, obtiene su password que nos mando en texto plano y lo pasamos por un MD5 luego el password ya hasheado los comparamos con el valor guardado en la DB, y si este corresponde (recordemos que una palabra "x" siemrpe tendra el mismo hash) entonces nuestro usuario puso el password correcto. El salt consiste en agregar un "password" o frase antes de hashear el password del usuario, por ejemplo si antes haciamos esto:

MD5.hash(passwordFiel.text);

ahora hacemos

MD5.hash("phraseORpasswordAnythingInHere123$%" + passwordFiel.text);


y entonces grabamos el password del usuario; en que nos ayuda esto? bueno recordemos que las rainbow tables que comunmente corren en internet no pasan de 14 caracteres (lo cual ya es bastante) sin embargo NO podemos pedirles a nuestros usuarios que escriban passwords de 30 caracteres para que estos sean seguros contra ls rainbow tables pues nadie recordaria esos passwords, entonces la "salt" que agregamos al password del usuario antes de hashearlo le agrega complejidad el password, lo hace mas largo, para que un hacker tuviera el hash de phraseORpasswordAnythingInHere123$%USUER_PASSWORD necesitara tener los hashes calculados todas las combinaciones de hasta unos 40 caracteres y ademas de signos no comunes, esto crea la complejidad de que el hacker deba generar sus propias ranbow tables, sin contar que un ranbow table de todas las combinaciones de hasta 40 caracteres sería gigantezca y contendria trillones o cuatrillones de hashes que le tomarían MUCHO tiempo de computar al hacker (a menos que cuente con un cluster que puedes rentar ahora en el cloud lo cual nos destrosaría), les recuerdo de nuevo que no hay técnica infalible pero los salted passwords nos ayudan a aumentar la seguridad de nuestro sistema y nos compran tiempo, es importante tener en cuenta los factores de segurdad siempre que codificamos y estar al día con las nuevas técnicas que desarrollan los hackers o si no seremos las siguiente víctimas.

En los siguientes posts hablare sobre como implementare mi proyecto en el jale (por fin a programar algo y sobre como usare los salted hashes thx por leerme!

Para mas geeky reading go below!

No hay comentarios:

Publicar un comentario

Deja tu comentario aquí, cuenta que te parecio el artículo o simplemente saluda!