¿Es este un método de hashing / ofuscación auto-lanzado? ¿Puedes reconocer el patrón?

46

Un sistema que estamos introduciendo en la organización no está utilizando ninguna función de hash tradicional que pueda encontrar. Me han asignado "aprobarlo" mediante pruebas de caja negra.

Sospecho que las contraseñas simplemente están siendo ofuscadas o cifradas (no hash) ya que la longitud del resultado cambia con la longitud de la contraseña (aunque parece que hay un mínimo, ¿relleno?).

Aquí hay algunos datos:

password   : result
1          : TG3432WB7VU=
11         : r8ahLkJGWbY=
111        : E7fXdNqEWAA=
11111111   : FIcx3a00R4eGhFyHjD56qw==
1111111111 : FIcx3a00R4evxqEuQkZZtg==
2111111111 : GPwnH80qEACvxqEuQkZZtg==

El resultado es obviamente base64, pero no se decodifica a nada legible. Antes de que supiera que la longitud del resultado cambió, intenté tomar los bytes decodificados y tratarlos como MD5 y otras funciones de hash, pero eso obviamente no funcionó. Ahora que sé que el resultado cambia en longitud, estoy considerando otras alternativas peores. Cabe destacar las dos partes en negrita de arriba: son idénticas en dos contraseñas diferentes. Entonces, cada uno de los 8 bytes se procesa de forma independiente (¿por qué?) O se está produciendo alguna sustitución polialfabética (?).

Actualizar:

El sistema acepta cualquier carácter, incluidos los caracteres Unicode, para las contraseñas. Repetir un carácter de 3 bytes 8 veces da como resultado un "hash" de 24 bytes.

    
pregunta coldfused 24.02.2016 - 20:37
fuente

4 respuestas

58

Sospecho que este es un método auto-rodado, o al menos muy anticuado. Es muy débil según los estándares modernos y no debe utilizarse para proteger nada importante.

Las contraseñas cortas se pueden descifrar con no más de 2 ^ 64 intentos de fuerza bruta, lo cual es muy posible incluso con una computadora normal. Si ambas mitades del resultado son independientes, incluso con contraseñas bastante largas, los intentos de fuerza bruta de 2 * 2 ^ 64 podrían romperlo (por lo tanto, 2 intentos de ^ 65). Probablemente haya más puntos débiles en el algoritmo que lo hacen más débil de lo que se describe aquí.

Otro punto interesante para probar sería 2111111111 y ver si la segunda parte del resultado sigue siendo la misma. Si la segunda parte no cambia, este es definitivamente un algoritmo débil.

Editar:

Al ver que los resultados de la prueba 2111111111 son los mismos para la segunda mitad, este es definitivamente un algoritmo débil y no debe usarse para proteger nada sensible. He incluido la comparación relevante a continuación:

  
  • 1111111111 : FIcx3a00R4e vxqEuQkZZtg ==
  •   
  • 2111111111 : GPwnH80qEAC vxqEuQkZZtg ==
  •   

Editar:

Otra prueba interesante sería lo que Ricky Demer sugiere a continuación:

  

Lo siguiente a verificar es que maneja los bloques de 8 bytes de manera idéntica. ¿Cuáles son los "hashes" de aaaaaaaabbbbbbbbc y bbbbbbbbaaaaaaaac? - Ricky Demer, 25 de febrero a las 6:44

Si manejó los bloques de 8 bytes de manera idéntica, es aún peor incluso para contraseñas largas, sin importar la longitud. Requeriría solo 2 ^ 64 intentos de fuerza bruta como lo señaló Neil en los comentarios. Una vez que alguien hizo una tabla de lo que calcula cada posibilidad, este algoritmo sería prácticamente inútil. Probablemente hay aún más puntos débiles para este algoritmo por descubrir.

Línea inferior:

No recomiendo usar este algoritmo independientemente de los resultados de la última prueba. Ya hemos visto suficiente para saber que es débil. Algo con un esquema de cifrado / hash de bits más alto, sal, tiempo de computación largo, etc. sería mucho mejor, y recomendaría ir con uno de los métodos comprobados existentes. El cifrado / hashing auto enrollado no ha tenido el beneficio de las pruebas exhaustivas que tienen la mayoría de los métodos de flujo principal.

    
respondido por el Jonathan 24.02.2016 - 21:26
fuente
10

El hecho de que la longitud de las cadenas codificadas dependa de la longitud de las contraseñas respectivas sugiere una debilidad mucho peor: las contraseñas parecen estar ofuscadas en lugar de estar ocultas .

¡Esto significa que cualquier persona que sepa las partes internas del sistema puede descifrar instantáneamente cualquier contraseña! Las implicaciones son numerosas: hay que confiar en los desarrolladores que alguna vez trabajaron en el sistema, el código fuente debe mantenerse en secreto para siempre (por eso está revisando una caja negra), etc.

Realmente no importa lo bueno que sea el algoritmo de ofuscación (y 2 64 no es exactamente estelar). Está roto por diseño.

    
respondido por el Dmitry Grigoryev 25.02.2016 - 14:14
fuente
4

Kerckhoffs's_principle obviamente se aplica: un sistema criptográfico debe ser seguro incluso si todo lo relacionado con el sistema, excepto la clave , es de conocimiento público.

Esto en sí mismo debería ser suficiente para que digas "No puedo aprobar este sistema sin más información".

A partir de sus ejemplos, parece que la entrada se divide en bloques de 8 caracteres / bytes, cada bloque se revisa individualmente y las salidas se juntan, entonces todo el resultado está codificado en base64.

Esto no es bueno. La mayoría de las contraseñas que tienen más de 8 caracteres son solo unos pocos caracteres más. Esto significa que un atacante puede romper el segundo bloque muy fácilmente. Y cuando conoce el segundo bloque, tiene una idea clara de lo que puede contener el primer bloque.

La comunidad criptográfica descubrió esto hace décadas y ya no generará bloques de forma independiente. Eso significa que estos programadores no están NO actualizados en criptografía.

La única buena noticia es que un cambio de un solo carácter en la contraseña cambia todo su bloque de salida. Esto probablemente significa que, de hecho, están encriptando las contraseñas y no solo confundiéndolas. Aún así, con las debilidades anteriores, la mejor función hash del mundo no puede guardar el algoritmo.

    
respondido por el Stig Hemmer 26.02.2016 - 10:18
fuente
2

Parece un simple cifrado de bloque, y definitivamente no es algo que quieras usar. Compárelo con, en lugar de hash de contraseñas, simplemente codifíquelos / ofuscándolos con, por ejemplo, base64. Esto es algo que nunca querrías hacer. Si alguien alguna vez aplica un criptoanálisis simple, podría descubrir fácilmente que solo son suficientes los caracteres que solían ser base64.

    
respondido por el ThePracticalCryptographer 25.02.2016 - 16:39
fuente

Lea otras preguntas en las etiquetas