Introducción
En la actualidad infinidad de paginas webs así como aplicaciones que requieren de un sistema de cuentas de usuario, para esto utilizan bases de datos para almacenarlas, pero acaso hace un buen trabajo al diseñar la manera que en que se tienen que proteger los passwords de los usuarios?, vemos que el peor error que se puede cometer es guardarlas en texto plano, para esto existen muchas y muy variadas formas de cifrar las contraseñas, que muchas veces por ser nuevos o no conocer las tecnologias no somos capaces de hacerlo correctamente, primero se tiene que conocer que los neologismos erroneos que decimos en español de ecriptar y desencriptar no se deben utilizar, se tiene que hablar correctamente sobre lo que se esta tratando, para esto como mencione antes lo correcto seria cifrar y descifrar, teniendo en cuenta esto, ahora nos debemos preocupar por otra cosa que es la seguridad de nuestras aplicaciones, muchas veces las diseñamos pero olvidamos esta parte, que muchas veces por falta de experiencia se comenten estos errores, pero claro crear software no es relativamente sencillo pero sobre la marcha se aprende, se tiene que buscar muchos medio y tener mucha lectura para aprender como se hace esto de manera correcta.
Forma general de protección utilizada
Se propone un ejemplo, para un pagina web, hecha en php y html, se incrusta un panel de logeo de usuario, este que como minimo se esta protegiendo contra ataques de tipo injecion sql, cross-site scripting u otro tipo de ataque, este tiene que tener un metodo de validado de usuarios, en el cual se valida el usuario y contraseña si tienen el formato correcto, despues de esto se mandan al servidor para que este regrese cierta informacion, ahi es donde se comente otro error ya que siempre y siempre se tiene que validar del lado del servidor, ya que aunque se tengan varias protecciones hay otros tipos de ataques que se pueden utilizar, como el famosisimo man-in-the-middle, que intercepta la comunicacion y aqui el atacante puede manipular la informacion a su favor, por esto es muy recomendable validar del lado del servidor, que anteriormente no se hacia ya que no se daban demasiado ataques, pero es mejor preparase contra todo y no esperar a que se presente un ataque de este tipo.
En muchos casos las paginas web son atacadas y por ende van contra la base de datos, por esto se tiene que tener un sistema de proteccion de passwords que sea muy enficiente contra ese tipo de ataques ya que si llegan a vulnerar la base de datos tendran el control total del sistema y demas partes, bien, entonces cuales son las formas mas habituales que utiliza la gente maliciosa contra estos sistemas?.
Hashing de passwords
Antes de hablar mas de esto, se hablara de el hashing de passwords que como sabemos es el cifrado de los passwords o algun tipo de informacion que se tiene alamacenada y no se quiere que se conozca su contenido, cuando se utiliza algun algoritmo de cifrado, nos da como resultado un hash correspodiente al contenido que se le dio por entrada, la idea es que este no se puede reversear, en otras palabras, si alguien estudia el algoritmo MD5 por ejemplo, y conoce como es el proceso de crifrado es no se puede regresar ya que los algoritmos de cifrado son para eso, solo hay una salida y no se puede tener el valor de un password atraves de su hash, entonces muchas personas que estan a cargo de un sistema de cuentas de usuario utilizan distintos algoritmos para crifrar sus passwords entre los mas debiles actualmente son los SHA-1 y MD5 que sabemos que hoy en dia hay muchas maneras que crackear los passwords, ya que como se habia dicho estos no se pueden regresar a su estado original desde su hash pero, hay formas de crackear los passwords que se explicaran a continuacion.
los dos cifrados son para: "hola"
MD5: 4d186321c1a7f0f354b297e8914ab240
SHA1: 99800b85d3383e3a2fb45eb7d0066a4879a9dad0
Tipos de ataques
Ataques por diccionario
Estos ataque son muy comunes pero que siguen siendo muy eficientes a la hora de crackear passwords, el ataque por diccionario es donde la persona maliciosa hace un gran numero de consultas donde por medio de un diccionario pre-construido se prueban muchos passwords comunes y creados para ver si algunos es el real, son diccionarios que contienen muchas palabras, fraces que se prueban para sabes si alguno es el correcto.
Ejemplo de un diccionario:
luis
pedro
p4dro
comida
root
toor
password
123456
y asi una lista enorme
Fuerza bruta
Este ataque tambien aunque lento pero sigue siendo efectivo, este consiste en ir formando fraces o palabra y provarlas, por ejemplo:
a
aa
ab
aba
abb
abba
y asi se van creando una combinacion de muchas cadenas las cuales si se tiene paciencia y mucho tiempo puede que funcionen.
Tablas de busqueda (lookup tables)
Esta forma de crackear passwords tambien es muy efectiva aqui lo que se crea son una gran cantidad de hashes de muchos passwords que se tienen, este metodo es muy agil cuando ya se conoce que tipo de cifrado se tiene para guardar los passwords en la base de datos, por ejemplo en md5, si se ah vulnerado la aplicacion y se ve que los passwords son guardados con este metodo de cifrado, entonces se crear muchas cadenas cifradas con md5 y se van provando, por ejemplo un diccionario de md5:
dd485e41f1758def296e1bc7377f8ea7
622798bed7c24ae5977c1503d2d5571e
465b1f70b50166b6d05397fca8d600b0
Tabla de busqueda inversa (reverse lookup table)
Encontramos este tipo de ataque tambien sumamente efectivo, esta se basa como su nombre lo dice en la inversa de la anterior esta en lugar de buscar que hash de algun password en la base de datos, esta utiliza el hash de un password y busca todos lo usuarios que contengan este password, ya que hay muchos casos en los que las personas utilizan el mismo password y aunque suene un poco no cuerdo, realmente pasa en la vida real, un ejemplo seria este:
password -> 5f4dcc3b5aa765d61d8327deb882cf99 -> se busca en la tabla de users todos los usuarios que tengan ese hash de contraseña
Tablas arcoiris (rainbow tables)
Estas son tablas que utilizan un algoritmo de reduccion, no lo voy a explicar ya que tomaria un tiempo, pero puede que despues haga un articulo, por el momento nos centraremos en lo que estamos, entonces las rainbow tables tambien son muy efectivas compensan el tiempo de crackeo y la velocidad y memoria de una computadora, como lo que dije anteriormente no esta muy claro aqui lo explico, las rainbow tables son enormes cantidades de hashes o palabras, ya que lo que se hace es tener una combiacion muy basta de alguna palabra que se toma poniendole cualquier tipo de caracter como un ejemplo pongo:
contraseña ------> 4c882dcb24bcb1bc225391a602feca7c
c0ntraseña ------> 1d87c04b17b5f45dab56968823a50e76
contraseñ@ ------> a4f93311c837fc944cd22e786392aa34
C0ntr4s3ñ@ ------> a77c4d12d8fdece0d6e902f821c63f40
Necesitamos ayuda!
Bien, vemos que existen muchos tipos de ataque que nos tomarian por sorpresa si no sabemos como defendernos correctamente, entonces vamos, necesitamos ayuda de algo o alguien para fortalecer el crifrado de las contraseñas, para eso vamos a hacer uso de un SALT o SAL,
SAL (salt)
Esta es una entrada de la funcion derivadora de claves y la otra es la contraseña o password y la salida de la funcion es la version cifrada de la misma, en otras palabras es la combinacion de un sal con una contraseña para fortalecer el hash de password, un ejemplo?:
password -> 5f4dcc3b5aa765d61d8327deb882cf99 -> se busca en la tabla de users todos los usuarios que tengan ese hash de contraseña
Tablas arcoiris (rainbow tables)
Estas son tablas que utilizan un algoritmo de reduccion, no lo voy a explicar ya que tomaria un tiempo, pero puede que despues haga un articulo, por el momento nos centraremos en lo que estamos, entonces las rainbow tables tambien son muy efectivas compensan el tiempo de crackeo y la velocidad y memoria de una computadora, como lo que dije anteriormente no esta muy claro aqui lo explico, las rainbow tables son enormes cantidades de hashes o palabras, ya que lo que se hace es tener una combiacion muy basta de alguna palabra que se toma poniendole cualquier tipo de caracter como un ejemplo pongo:
contraseña ------> 4c882dcb24bcb1bc225391a602feca7c
c0ntraseña ------> 1d87c04b17b5f45dab56968823a50e76
contraseñ@ ------> a4f93311c837fc944cd22e786392aa34
C0ntr4s3ñ@ ------> a77c4d12d8fdece0d6e902f821c63f40
Necesitamos ayuda!
Bien, vemos que existen muchos tipos de ataque que nos tomarian por sorpresa si no sabemos como defendernos correctamente, entonces vamos, necesitamos ayuda de algo o alguien para fortalecer el crifrado de las contraseñas, para eso vamos a hacer uso de un SALT o SAL,
SAL (salt)
Esta es una entrada de la funcion derivadora de claves y la otra es la contraseña o password y la salida de la funcion es la version cifrada de la misma, en otras palabras es la combinacion de un sal con una contraseña para fortalecer el hash de password, un ejemplo?:
password + YYLmfY6IehjZMQ = 77653244c6961112e659dc6bf496340c
Como se muestra en el ejemplo esa seria la manera de usar un Salt para fortalecer el cifrado de una contraseña, ahora viene otra cuestion.
No hacerlo de manera incorrecta
Vemos que el Salt se agrega a la contraseña para fortalecer su cifrado, pero antes de utilizarlo se debe tener en cuenta algunas cosas.
-No utilizar un Salt corto.
-No utilizar el mismo Salt para varias contraseñas.
-No inventar propios Salt's
Otra cosa que se debe de tener en mente es no combinar varios hash, con esto se genera la idea erronea de que el password es mas seguro por ejemplo:
sha1(md5+salt)
esto es una mala practica, puede que muchos digan que es segura pero como ya se vio arriba hay formas de crackear estos cifrados.
Finalmente la manera correcta de cifrar passwords en C#
Llegamos a la parte mas interesante que es la de como vamos a cifrar los password de manera correcta?, entonces primero debemos generar un Salt seguro, como se menciona anteriormente no se debe inventar un propio Salt, se debe de utilizar algoritmos diseñados por expertos que por algo los diseñan, asi que no se den la tarea de hacerlo en casa, je, bueno continuando para generar un Salt en C#, se utiliza el algoritmo: Criptographically Secure Pseudo-Random Number Generator (CSPRNG), que como su nombre lo dice es criptograficamente seguro ademas de su alto nivel de aleatoriedad que proporciona, y no es para nada facil predecir la forma es que se generan los numeros, ya que tenemos la funcion de generacion de la Salt vamos a ver como implementarla en codigo:
En C# ya esta implementada en la libreria de System.Security.Criptography la funcion de derivacion de claves que se va a ocupar, que es la PBKDF2 por sus siglas (Password-Based Key Derivation Function 2), un poco de historia, es que forma parte de los laboratorios RSA y de los estandares de criptografìa de clave publica, PBKDF2 aplica una funcion seudo-aleatoria que requiere de una entrada mas la salt, repite el proceso varias veces para producir la clave derivada que tambien se conoce como clave de estiramiento, el numero de iteraciones que se recomiendo es del minimo 1000.
PROCESO DE DERIVACION DE LA CLAVE:
Cgd = PBKDF2 ( FSA, Password, Salt, I, Lcd)
Cgd = Clave generada derivada
FSA = Funcion Seudo-Aleatoria de longitud con dos parametros de salida
Password = Contraseña
I = Numero de iteraciones
Lcd = Longitud deseada de la clave derivada
Código para generar:
Código de comprobación un Hash:
El hash que me da para:
contraseña = smj1FNyXjxnRUkaOEe7fT75GSWWerfow
si lo hace a ustedes les va a dar otra cosa, ya que se usa un Salt diferente cada ves que se ocupa.
Conclusiones
Hemos visto la forma en que se cifran las contraseñas para que sean mas seguras, pero muy aparte de eso tambien se deben de tomar muchas medidas mas de seguridad, esto se explico con el fin de fortalecer los hashes de los passwords, ya que muchos programadores crean bases de datos, pero no estan muy seguros o no saben como implementar la parte de seguridad adecuadamente, vemos que agregandole un Salt a un password este lo hace mucho mas fuerte, encontra los ataques descritos anteriormente seria muy dificil computar el hash correcto, ya que los Salts son diferentes para todos los passwords, al final del dia la seguridad no solo se basa en la fortaleza de un hash de un password sino del trabajo en equipo que se crea atraves de un conjunto de aplicaciones y herramientas para asegurar la informacion con su constante actualizacion y tambien en el de concientizar a nuestros usuarios e integrantes de equipo a utilizar de manera correcta las herramientas.
PROCESO DE DERIVACION DE LA CLAVE:
Cgd = PBKDF2 ( FSA, Password, Salt, I, Lcd)
Cgd = Clave generada derivada
FSA = Funcion Seudo-Aleatoria de longitud con dos parametros de salida
Password = Contraseña
I = Numero de iteraciones
Lcd = Longitud deseada de la clave derivada
Código para generar:
los dos códigos se crean en la misma clase.
El hash que me da para:
contraseña = smj1FNyXjxnRUkaOEe7fT75GSWWerfow
si lo hace a ustedes les va a dar otra cosa, ya que se usa un Salt diferente cada ves que se ocupa.
Conclusiones
Hemos visto la forma en que se cifran las contraseñas para que sean mas seguras, pero muy aparte de eso tambien se deben de tomar muchas medidas mas de seguridad, esto se explico con el fin de fortalecer los hashes de los passwords, ya que muchos programadores crean bases de datos, pero no estan muy seguros o no saben como implementar la parte de seguridad adecuadamente, vemos que agregandole un Salt a un password este lo hace mucho mas fuerte, encontra los ataques descritos anteriormente seria muy dificil computar el hash correcto, ya que los Salts son diferentes para todos los passwords, al final del dia la seguridad no solo se basa en la fortaleza de un hash de un password sino del trabajo en equipo que se crea atraves de un conjunto de aplicaciones y herramientas para asegurar la informacion con su constante actualizacion y tambien en el de concientizar a nuestros usuarios e integrantes de equipo a utilizar de manera correcta las herramientas.
No hay comentarios:
Publicar un comentario