En este set de entradas empezamos viendo un par de hashes (SHA1 y MD5), acto seguido vimos como "concentrar" un diccionario precomputado con millones de entradas (una "Rainbow Table").
Ahora es el momento de explicar la fuerza bruta.
¡Vamos allá!
Volvamos un poco hacia atrás. ¿Recordáis que decíamos que almacenar todo el hash era inviable?
Realmente lo es, bueno menos para las grandiosas compañías que se lo puedan permitir. Pero quitando esa salvedad, ¿porqué almacenarlo si podemos crearlo?
¿Crearlo?¿No era imposible?
Y prácticamente lo es, pero seamos sinceros, podemos ir probando (por eso que no quede). Para ahorrar el espacio podemos hacer simplemente un bucle numérico que incremente y vaya comprobando hash a hash.
Algo así como:
i=0
e=no
haz
si(hash(i) = entrada)
e=si
sino
incrementa i
fin
mientras no e
e=no
haz
si(hash(i) = entrada)
e=si
sino
incrementa i
fin
mientras no e
Esto nos garantiza (con el tiempo suficiente) que el hash saldrá. Pero obviamente es bastante ineficaz; aunque hagamos programación concurrente combinada con GPU será muy probable que nos hagamos viejos antes de dar con un has de un texto de más de 8 caracteres.
Y esto, amigos, es básicamente la fuerza bruta.
Hay ciertas aplicaciones que permiten, en mayor o menor medida, que este método sea viable. Tengamos por ejemplo una web cuyo login sea un correo electrónico y un password autogenerado de 4 caracteres ASCII (lo he visto, testeado y explotado, como podéis ver aquí).
Las combinaciones son relativamente pocas, y se puede hacer relativamente fácil encontrar la contraseña en un tiempo razonable (24h a lo sumo).
De ahí a que nos insten a usar contraseñas largas, con caracteres especiales (aumenta considerablemente el número de combinaciones).
Realmente es poco usada la fuerza bruta (lo fue en su día), y creo que dentro de este bloque debía incluirlo.
Espero que os sea útil en algún momento.
Como siempre,
¡Hasta la próxima!
No hay comentarios:
Publicar un comentario