¿Puedo determinar qué algoritmo se usó si conozco el hash coincidente de una entrada determinada?

7

Si sé el texto original "12345" que se codifica como "Tut0nlFFZ9sLVhPE5x81lQ ==", ¿cómo puedo identificar el algoritmo de hash?

    
pregunta Prince5 22.02.2013 - 10:11
fuente

5 respuestas

7

En observación, esto se parece a la codificación base64 (tenga en cuenta que esto no es un hash, es una cadena codificada). Puedo decir esto ya que sé que este algoritmo de hash rellena el final de la cadena con = según sea necesario. Otros signos indicativos pueden ser del uso de ciertos caracteres en la cadena. Aprenderás esto simplemente exponiéndote a los ejemplos existentes y leyendo sobre los diversos algoritmos de codificación que hay.

La cadena codificada en base64 de 12345 es en realidad MTIzNDU= , no lo que proporcionó. Decodificando los rendimientos de cadena proporcionados: NëtžQEgÛVÄç5• . La alta entropía aquí indica que esto es probablemente el resultado de algún algoritmo de cifrado. Dado que el punto de un buen algoritmo de cifrado es la incapacidad de determinarlo a partir de datos aleatorios, a menudo no es fácil descubrir qué algoritmo se usó y normalmente tendría que recurrir a esfuerzos de fuerza bruta.

Suponiendo que este es un tipo de ejercicio en el que está seguro de que su entrada se resuelve y se le ha pedido que determine la contraseña utilizada para cifrarla, puede utilizar la fuerza bruta utilizando un método que, después de probar una contraseña, verifica si la salida es de hecho 12345 . De esta manera usted realmente puede verificar que ha adivinado la contraseña correcta. Buena suerte!

    
respondido por el deed02392 22.02.2013 - 10:23
fuente
5

El "valor cifrado" es Base64 : esta es una codificación para bytes arbitrarios en caracteres imprimibles . En Base64, cada tres bytes de entrada se convierten en cuatro caracteres; los caracteres posibles son letras (mayúsculas y minúsculas), dígitos, '+' y '/'. Además, puede haber uno o dos signos '=' finales, de modo que la longitud total sea un múltiplo de 4. Estos signos '=' son un sorteo muerto de Base64.

En su caso, el "valor cifrado" es la codificación Base64 de una secuencia de 16 bytes. Estos 16 bytes, en hexadecimal, serían 4eeb749e514567db0b5613c4e71f3595 . En el contexto de las funciones hash, 16 bytes generalmente significan MD4 o MD5. Pero hay muchas variantes posibles. Por ejemplo, si ese "valor cifrado" aparece en una "base de datos de usuarios" (por ejemplo, una contraseña con hash), entonces es muy posible que la entrada esté "salted" de alguna manera con otros campos específicos del usuario. Para verificarlo, intente dar la misma contraseña a dos usuarios distintos; Si obtienen distintos hashes, se aplica salting (posiblemente con el nombre de usuario o algún otro campo).

Tales valores no aparecen solos; están en un contexto : lo encontró en un archivo o base de datos, vinculado con alguna aplicación o software de servidor. Las claves sobre el tipo de cifrado de la función hash se encuentran en ese contexto.

    
respondido por el Thomas Pornin 22.02.2013 - 13:39
fuente
2

Está utilizando el hashing y la codificación y el cifrado al mismo tiempo para la misma cosa, mientras que son cosas completamente diferentes. En pocas palabras:

  • hashing = > Una forma irreversible
  • cifrado = > reversible pero protegido de forma segura
  • codificación protegida = > reversible sin protección

Su mejor manera de averiguarlo es tomar todos los algoritmos diferentes y hash / codificar su texto sin formato y ver cuál de los resultados coincide. Tengo la fuerte sensación de que la codificación es BASE64. Ahora puede ser que lo que hicieron es: BASE64 (hash (x)), por lo que lo mejor es descifrar BASE64, tomar la representación binaria y compararla con diferentes resultados de hashing de su cadena de texto sin formato.

    
respondido por el Lucas Kauffman 22.02.2013 - 10:25
fuente
0

En primer lugar, permítame señalar que Tut0nlFFZ9sLVhPE5x81lQ== es una codificación base64 de la cadena "NtQEgV5" y no es un valor resultante de una función de hashing.
En segundo lugar, dado que su pregunta sugiere que la diferencia entre encriptación y hashing no está clara, le sugiero que analice estas dos preguntas de SO antes de continuar explorando el tema. ( one y two ).

De vuelta a la pregunta, para detectar qué función de hash se ha utilizado, puede echar un vistazo al valor de hash, ya que los algoritmos de hash suelen tener una salida de longitud fija. Por ejemplo, MD5 produce un valor de 128 bits (32 caracteres hexadecimales), mientras que SHA1 produce un valor de 160 bits (40 caracteres hexadecimales). Vamos a verlo en acción:

  • El hash MD5 de "12345" es 827ccb0eea8a706c4c34a16891f84e7b y el hash SHA1 es 8cb2237d0679ca88db6464eac60da96345513964
  • El hash MD5 de "1234567890" es e807f1fcf82d132f9bb018ca6738a19f y el hash SHA1 es 01b307acba4f54f55aafc33bb06bbbf6ca803e9a .

Como puede ver, los hashes tienen la misma longitud que los calculados en la cadena más corta.

Incluso si tiene acceso tanto al texto claro como a su valor de hash, es posible que encontrar el algoritmo utilizado no sea tan sencillo como parece.

Si la implementación utiliza un único algoritmo de hash (lo cual es una práctica común), la detección del correcto es trivial y se puede hacer con aplicaciones de libre acceso (por ejemplo, MD5Decrypter ). Tenga en cuenta que algunas aplicaciones pueden implementarlo de manera diferente:

  • codifique los hashes antes de guardarlos (por ejemplo, base64(md5($text)) ): la decodificación de esquemas comunes se puede lograr con una de las muchas herramientas disponibles de forma gratuita.
    • por ejemplo el hash MD5 de "12345" codificado en Base64 es gnzLDuqKcGxMNKFokfhOew==
  • algoritmos de hashing múltiple (por ejemplo, sha1(md5($text)) ): descubra uno por uno hasta que se detecte el último
  • se puede usar salt para fortalecer los hashes contra los ataques: todavía es posible detectar el algoritmo de hash utilizado, pero simplemente el hashing del texto claro no devolverá el mismo valor
  • mientras que en contra de las mejores prácticas, una aplicación puede lucir un algoritmo personalizado utilizado para almacenar información: la dificultad para determinar cómo se manipula la cadena de texto sin cifrar depende completamente de la implementación personalizada.

También es posible averiguar qué algoritmo se está utilizando al conocer la tecnología subyacente: las contraseñas de Windows pueden ser hashes LM o NTLM, las credenciales encontradas en una base de datos MySQL pueden (no son comunes) con la función PASSWORD () de MySQL, etc.

    
respondido por el Gurzo 22.02.2013 - 20:00
fuente
0

Hay más de una forma de generar tal salida. Una herramienta que puede ayudarlo de una manera más genérica para esta tarea, se llama Codetective: enlace

P.S .: Puedo estar sesgado: P

    
respondido por el user21125 23.02.2013 - 12:04
fuente

Lea otras preguntas en las etiquetas