¿Cómo determinar qué tipo de codificación / encriptación se ha utilizado?

137

¿Hay alguna forma de encontrar qué tipo de cifrado / codificación se está utilizando? Por ejemplo, estoy probando una aplicación web que almacena la contraseña en la base de datos en un formato cifrado ( WeJcFMQ/8+8QJ/w0hHh+0g== ). ¿Cómo puedo determinar qué hash o cifrado se está utilizando?

    
pregunta Karthik 20.05.2011 - 13:12
fuente

8 respuestas

119

Su cadena de ejemplo ( WeJcFMQ/8+8QJ/w0hHh+0g== ) es una codificación Base64 para una secuencia de 16 bytes, que no parece ASCII o UTF-8 significativa. Si este es un valor almacenado para la contraseña verificación (es decir, no es realmente una contraseña "encriptada", sino una contraseña "hash"), entonces este es probablemente el resultado de una función hash computado sobre la contraseña; La única función hash clásica con una salida de 128 bits es MD5. Pero podría ser sobre cualquier cosa.

La forma "normal" de saber es mirar el código de la aplicación. El código de la aplicación se encarna de una manera tangible y gruesa (archivos ejecutables en un servidor, código fuente en algún lugar ...) que no está, y no puede estar, tan protegido como una clave secreta. Así que la ingeniería inversa es el "camino a seguir".

A menos que la ingeniería inversa, puede hacer algunos experimentos para intentar hacer conjeturas informadas:

  • Si el mismo usuario "cambia" su contraseña pero reutiliza la misma, ¿cambia el valor almacenado? Si es así, entonces parte del valor es probablemente una "sal" aleatoria o IV (suponiendo un cifrado simétrico).
  • Suponiendo que el valor es determinista a partir de la contraseña para un usuario determinado, si dos usuarios eligen la misma contraseña, ¿el resultado será el mismo valor almacenado? Si no, entonces el nombre de usuario es probablemente parte del cálculo. Es posible que desee intentar calcular MD5 ("nombre de usuario: contraseña") u otras variantes similares, para ver si obtiene una coincidencia.
  • ¿Está limitada la longitud de la contraseña? Es decir, si establece una contraseña de 40 caracteres y no puede autenticarse satisfactoriamente escribiendo solo los primeros 39 caracteres, entonces esto significa que todos los caracteres son importantes, y esto implica que realmente se trata de una contraseña hashing , no < em> encryption (el valor almacenado se usa para verificar una contraseña, pero la contraseña no se puede recuperar solo del valor almacenado).
respondido por el Thomas Pornin 23.05.2011 - 17:00
fuente
63

Editar: Me acabo de dar cuenta de una secuencia de comandos muy interesante llamada hashID . El nombre lo describe bastante.

~~~

En términos generales, el uso de la experiencia para hacer suposiciones informadas es cómo se hacen estas cosas.

Aquí hay una lista con una gran cantidad de salidas de hash para que sepa cómo se ve cada una y cree firmas / patrones o simplemente verifique ópticamente.

Hay dos cosas main a las que primero presta atención:

  • la longitud del hash (cada función hash tiene una longitud de salida específica)
  • se usa el alfabeto (¿todas las letras en inglés son números 0-9 y A-F, así que hexadecimal? ¿qué caracteres especiales hay, si hay alguno?)

Varios programas de descifrado de contraseñas (John el destripador, por ejemplo) aplican algunos patrones de coincidencia en la entrada para adivinar el algoritmo utilizado, pero esto solo funciona con hashes genéricos. Por ejemplo, si toma cualquier salida de hash y gira cada letra en 1, la mayoría de los esquemas de coincidencia de patrones fallarán.

    
respondido por el john 20.05.2011 - 13:22
fuente
24

Lo que ha publicado es 16 bytes (128 bits) de datos codificados en base 64. El hecho de que esté codificado en base 64 no nos dice mucho porque la base 64 no es un algoritmo de cifrado / hash, es una forma de codificar datos binarios en texto. Esto significa que este bloque incluye una información útil, a saber, que la salida tiene una longitud de 16 bytes. Podemos comparar esto con el tamaño de bloque de los esquemas comúnmente usados y descubrir qué no puede ser. Con mucho, los esquemas más comunes son:

Lo siguiente que debemos hacer es mirar otros bloques de texto cifrado para encontrar la respuesta a la siguiente pregunta:

  • ¿Todos los textos cifrados tienen la misma longitud, incluso para diferentes longitudes de entrada?

Si no todos los bloques tienen la misma longitud, entonces no está buscando un algoritmo de hash, sino uno encriptado. Dado que la salida siempre será un múltiplo del tamaño del bloque subyacente, la presencia de un bloque que no es divisible por 16 bytes significaría que no puede ser AES y, por lo tanto, debe ser DES o 3DES.

Si tiene la capacidad de ingresar una contraseña y observar el resultado, esto se puede determinar muy rápidamente. Simplemente introduzca una contraseña de 17 caracteres y mire la longitud. Si tiene 16 bytes tiene MD5, 20 bytes significa SHA-1, 24 bytes significa DES o 3DES, 32 bytes significa AES.

    
respondido por el Yaur 23.05.2011 - 05:34
fuente
6

Depende del formato: algunos protocolos para almacenar texto encriptado tienen una parte de texto en claro que define cómo se encripta. Por su ejemplo, tengo dudas ya que la cadena a la que hace referencia es tan corta que parece que es solo el texto cifrado.

Sugeriría un par de pensamientos:

  • El "==" en el extremo definitivamente será relleno, así que no incluyas eso en ningún intento de descifrado.

  • Puede estar tratando con un hash o un hash salado, en lugar de con cifrado. En ese caso, tratar de "descifrar" los datos no funcionará, debe hacer coincidir las contraseñas utilizando el mismo valor de hash y / o sal que se usó originalmente. No hay forma con una contraseña con sal para obtener el valor original.

  • Su mejor apuesta absoluta es obtener una copia del código que se utiliza para almacenar las contraseñas. En algún lugar de allí, las contraseñas están experimentando una operación criptográfica. Encuentra el código para saber qué está pasando aquí. 9 de cada 10 veces, están usando algún tipo de API para el hashing / salting / encriptación y puede imitarlo o revertirlo utilizando la misma API.

respondido por el bethlakshmi 20.05.2011 - 19:47
fuente
6

La codificación generalmente se puede adivinar en. Por ejemplo, la cadena que publicó en su pregunta está codificada en Base64. Los signos de igualdad se rellenan en el esquema Base64. Eso es algo que sé de la experiencia.

Si me dio una cadena cifrada, es posible que pueda decirle la codificación, pero no puedo decirle el algoritmo utilizado para cifrarla a menos que haya algún tipo de metadata disponible. La razón es esta: los algoritmos de encriptación funcionan al producir lo que parecen ser datos aleatorios. Si cifrara dos oraciones, cada una con dos cifrados (cuatro salidas), no podría decirme con certeza qué texto cifrado pertenecía a qué cifrado a menos que lo descifrara o rompiera el cifrado.

En lo que respecta a su instancia específica, las contraseñas generalmente están en hash. Eso significa que no puede recuperar la contraseña del hash, pero puede hacer una prueba para ver si el hash coincide con la contraseña. En ese sentido, La respuesta de @Juan es dorada. Si puedes ingresar una contraseña que conoces y luego probar esquemas comunes contra ella, puedes aprender qué es el hash utilizado.

    
respondido por el Jeff Ferland 23.05.2011 - 17:17
fuente
6

Si este es un simple hash de contraseña, podríamos usa Google para descifrarlo . Sin embargo, es difícil buscar Base64 con todas esas barras y más signos, por lo que primero debemos convertir ese hash en hexadecimal:

$ perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

Bien, ahora podemos Google for it . Por el momento, estoy recibiendo solo una Golpe , desde md5this.com - aunque obviamente pronto habrá más, incluyendo esta publicación.

Desafortunadamente (o quizás afortunadamente, dependiendo de tu perspectiva), no tenemos la suerte de encontrar una preimagen (el sitio actualmente enumera este hash como "cracking ..."), pero el hecho de que está en esa lista en absoluto sugiere que sea un hash MD5 sin sal de una contraseña real.

    
respondido por el Ilmari Karonen 20.10.2011 - 13:23
fuente
4

La única forma es adivinar. Con experiencia, el trabajo de adivinar será más correcto.

Por ejemplo: según la longitud de la salida: la salida MD5 es de 128 bits, o 16 bytes, la salida SHA1 es de 160 bits, o 20 bytes. Basado en el conjunto de caracteres de la salida: BASE64 produce una salida con caracteres imprimibles.

Al final del día, es el enfoque de prueba y error que te enseña cómo hacerlo.

    
respondido por el Nam Nguyen 20.05.2011 - 15:01
fuente
1

La única forma es cuando hay algunos metadatos que te dicen. Por ejemplo, he estado trabajando con archivos PDF últimamente, y el formato incluye un diccionario que contiene el filtro, el algoritmo, el tamaño de la clave, etc. datos.

    
respondido por el user185 20.05.2011 - 15:26
fuente

Lea otras preguntas en las etiquetas