¿Cómo descifrar una contraseña dado su hash y su sal utilizando un método más eficiente que la fuerza bruta?

20

He podido descifrar contraseñas, dadas sus sales y sus hashes, mediante el uso de la fuerza bruta.

En primer lugar, la longitud de las contraseñas era 3 y la longitud de sal 2:

por ejemplo , hash: rrVo/xC.s5/hQ , salt: rr = > contraseña: thr (tiempo: ~ 0m4.579s)

Ahora, para contraseñas de longitud 4 y longitud de sal 2:

por ejemplo , hash: ss1C5xfz6Nggg , salt: ss = > contraseña: four (tiempo: ~ 7m19.531s)

Como he dicho, estas contraseñas se obtuvieron utilizando un algoritmo de fuerza bruta. Es útil para longitudes de contraseña cortas: a medida que aumenta el número de caracteres para la contraseña, el tiempo necesario para romper la contraseña crece exponencialmente.

Lo que quiero saber es una técnica más eficiente para reducir el espacio de búsqueda.

Información adicional:

  1. Las contraseñas se crean usando: A-Z, a-z, 0-9 y símbolos: $, #, +, @, =, /, &

  2. He estado usando el comando openssl para generar los hash y los he comparado con el hash dado

    $ openssl passwd -crypt -salt rr thr
    

en un script bash.

    
pregunta InfZero 06.03.2017 - 05:50
fuente

5 respuestas

25

Sin más información, no puede reducir el espacio de búsqueda. Como no tiene información previa sobre la contraseña, no puede descartar ninguna contraseña posible desde el espacio de búsqueda.

Si su función hash (que no especifica) tiene algunas vulnerabilidades, es posible que pueda aprender algo sobre la contraseña antes de iniciar el intento de fuerza bruta (comienza con 'a', contiene 'b' y así sucesivamente. ..). Reduciendo así el espacio de búsqueda.

Otra cosa que puede responder a su necesidad de que las contraseñas sean más rápidas es Rainbow Tables , que son una precomputación que realiza dada la sal , para poder encontrar la contraseña más rápido después. Las tablas del arco iris se utilizan como una tabla de búsqueda para un hash dado.

Supongamos que tenemos hash('four','ss') = ss1C5xfz6Nggg y conocemos la sal ss . Realizaremos la siguiente precomputación:

LatablaRainbowrealdebeordenarsedeacuerdoconlosvaloresdehash,parapermitirunabúsquedarápida.Deestamanera,cuandosenosproporcionaelhashdelacontraseña,ss1C5xfz6Nggg,solonecesitamosbuscarelhashenlatablaRainbowynuestracontraseñasealmacenajustoallado.Deestemodo,elprocesodecraqueoesmuchomásrápido(acostadeltiempodeprecomputación,porsupuesto).

Editar: El comentario de Sjeord es correcto, por lo que debo señalar que:

  

Las tablas Rainbow, a pesar de su reciente popularidad como tema de las publicaciones del blog, no han envejecido con gracia. Las implementaciones CUDA / OpenCL de crackers de contraseñas pueden aprovechar la enorme cantidad de paralelismo disponible en las GPU, alcanzando un máximo de miles de millones de contraseñas candidatas por segundo. Literalmente, puede probar todas las contraseñas alfabéticas en minúscula que tienen ≤7 caracteres en menos de 2 segundos. Y ahora puede alquilar el hardware que hace esto posible por una suma de menos de $ 3 por hora. Por alrededor de $ 300 por hora, podrías descifrar alrededor de 500,000,000,000 de contraseñas candidatas por segundo.

Fuente

    
respondido por el MiaoHatola 06.03.2017 - 08:55
fuente
19

No hay manera de recuperar la contraseña más rápido que la fuerza bruta, pero hay muchas cosas que puedes cambiar acerca de tu velocidad de fuerza bruta.

  

cuatro (tiempo: ~ 7m19.531s)

Este es un largo tiempo para forzar una contraseña tan breve. Obtendría una gran mejora en el rendimiento utilizando hashcat con una tarjeta gráfica decente. Podría romperlo en menos de dos segundos con el siguiente comando:

/usr/src/cudaHashcat-2.01/cudaHashcat64.bin ss1C5xfz6Nggg -m 1500 -a 3
    
respondido por el Sjoerd 06.03.2017 - 08:55
fuente
9

Todo el propósito del sistema de sal + hash es que no debería haber manera más rápida que un ataque de fuerza bruta. Como BgrWorker ya señaló, hay de hecho debilidades en algoritmos hash más antiguos que reducen el espacio de búsqueda (o más precisamente: permiten el cálculo de colisiones), pero descubrir uno se considera un avance que encontrará en una revista más probable que en Una respuesta de stackoverflow. :-)

Hay algunos trucos comunes que puedes usar:

Las

Rainbow Tables ya se mencionaron y, dependiendo del tamaño de sal, incluso para el hash realista y la longitud de las contraseñas, brindan un posible acceso a las 100 contraseñas más o menos.

Uso de ataques de diccionario y crackers en lugar de fuerza bruta tonta. La contraseña aaaaaaaa es mucho menos probable que la contraseña "contraseña" o "12345678", por lo que probarlas primero es inteligente.

Finalmente, en muchos escenarios del mundo real, la política de contraseñas de un sitio o compañía en realidad reduce su espacio de búsqueda, a veces dramáticamente. Si la contraseña no solo puede, sino que debe contener, digamos, al menos un número y un carácter especial, su espacio de búsqueda en 8 caracteres solo se eliminó de 10 ^ 15 a 10 ^ 13.

    
respondido por el Tom 06.03.2017 - 15:02
fuente
4

Creo que tu problema es que estás usando openssl en un script de bash. Esto significa que cada nuevo intento de contraseña debe generar otro proceso. Para fuerza bruta, considere usar un lenguaje de programación compilado eficiente como C. Estoy seguro de que encontrará que su eficiencia aumenta en más de un orden de magnitud.

Por supuesto, esto significa que tendrá que volver a escribir toda su aplicación de fuerza bruta.

    
respondido por el juhist 06.03.2017 - 19:13
fuente
2

Lo que busca está en oposición directa a los objetivos fundamentales de los algoritmos de hash de contraseñas en general. No debe sorprenderse de que lo que busca es difícil: las personas han pasado miles de horas haciéndolo difícil.

La gente ha mencionado Rainbow Tables y otros enfoques de hash de contraseñas, lo que sería una extensión lógica de lo que estás haciendo. La otra alternativa es aprovechar el hecho de que las personas normalmente no eligen contraseñas perfectamente aleatorias. Los programas como John the Ripper están diseñados para explotar esto, utilizando esquemas comunes de generación de contraseñas para adivinar primero las contraseñas más probables. Esto significa que solo tiene que recurrir a una búsqueda de fuerza bruta si la contraseña fue bien elegida.

    
respondido por el Cort Ammon 07.03.2017 - 01:36
fuente

Lea otras preguntas en las etiquetas