9 de octubre de 2010

Ataques por Diccionario (Dictionary Attack) ¿Como prevenirlos?

Indudablemente los programadores conscientes de la importancia de proteger los datos del usuario evitan incorporar datos como claves de acceso e información personal delicada en formato de texto plano sobre un archivo o en una base de datos, ya que en caso de intrusión en el sistema dicha información podría caer en poder del atacante y poner en riesgo al usuario. Punto a parte, si usted aún guarda las claves de sus usuarios en texto plano en una base de datos o archivos de texto, debiera plantearse actualizar sus conocimientos a nivel de seguridad.


El mejor método para evitar tener la responsabilidad de guardar claves de acceso es precisamente no guardarlas, por lo cual se hacen de gran utilidad para este tipo de casos los algoritmos de HASHing o hash, que mediante fórmulas matemáticas sofisticadas obtienen huellas únicas irrepetibles para cualquier tipo de cadena de texto. Quizás lo más importante que pueden ofrecer estos algoritmos es que no son reversibles, por lo que se les llama comúnmente algoritmos de cifrado de una sola vía. Esto significa que usted puede obtener una firma única como resultado de una cadena de texto sometida a este tipo de algoritmos, pero no puede obtener la cadena de texto a partir del resultado obtenido.


Hay muchos algoritmos de "hash" al alcance de los programadores y en algunos casos forman parte de las librerías de cifrado de los entornos de programación como Java y .NET por citar solo algunos. Ejemplo de los anteriores son MD5 (Message Digest Algorithm 5), SHA1 (Secure Hashing Algorithm 1), Whirlpool y otros.


Sin embargo no necesariamente el usuario está seguro si usted usa alguno de estos algoritmos, ya que también se producen lo que se denominan Ataques por Diccionario (Dictionary Attack). Este tipo de ataques consiste en utilizar bases de datos con los hash resultantes de cifrar los tipos de claves de acceso más comunes. 


Ejemplo práctico: Usted puede conseguir este tipo de bases de datos inclusive en línea. Si tiene dudas intente introducir el siguiente hash MD5(en negritas): ff9830c42660c1dd1942844f8069b74a en el diccionario en línea de este interesante enlace y verá como se obtiene del diccionario la clave "root123". Impresionante ¿no?


¿Cómo? ¿No era que los algoritmos hash son irreversibles?
Si lo son, pero los resultados de los mismos para cadenas de texto conocidas se pueden guardar en diccionarios. Simple y efectivo.



¿Cuál es entonces la solución para proteger las claves de los usuarios de este tipo de ataque?
Indudablemente si hablamos de claves en un diccionario estamos siempre hablando de claves deficientes o pobres. Una buena parte del problema se reduciría radicalmente si los usuarios escogieran claves más fuertes y menos evidentes (como para que no existan en un diccionario). Sin embargo todos los programadores sabemos que contar con el esfuerzo del usuario no siempre es la mejor opción por lo que la solución no puede depender de ellos. Por ejemplo estos diccionarios contienen las fechas de los últimos 40 años en formato hash. Es por eso que una simple fecha es una clave de acceso de las más ineficientes.


La mejor solución para evitar este tipo de ataque es utilizar lo que se conoce como "Salt Key" que para el caso que nos incumbe (la definición criptográfica puede ser más compleja) no es más que una cadena de texto que se agrega al texto original antes de ser cifrado. De esta forma el atacante no puede comparar los hash ya que necesitaría un diccionario completamente nuevo. Lo más importante es que aunque el atacante llegara a conocer el "Salt Key" no le serviría de absolutamente nada ya que los diccionarios existentes no tendrían las cadenas resultantes de utilizarlo. El programador solo tiene que tener en cuenta agregarlo de igual forma cada vez que compare el hash guardado con el producido por la clave recibida a la hora de validar la clave.


Recuerde que como el proceso de hash no es reversible, simplemente habría que crear un diccionario nuevo para cada "salt key" utilizado. Usted puede inclusive reforzar la técnica usando un "Salt Key" variable, pero dejaremos este truco avanzado para otra oportunidad. Espero que esta simple información le sea útil.

Hasta la próxima.
\backslash

1 comentario:

omar marcelo dijo...

Muy interesante el articulo. Justo ahora estoy desarrollando una aplicacion para Android y me gustaria saber que algoritmo de cifrado resulta bueno para dispositivos moviles ya que estos no cuentan con mucho poder de procesamiento.

Entradas populares