¿Cómo puedo crear una contraseña que diga "¡SALT ME!" cuando se escribe hash?

74

¿Cómo puedo crear una contraseña, la cual, cuando se rellena directamente (sin sal) con md5 devolverá una cadena que contiene los 8 caracteres "SALT ME!". La esperanza es que un desarrollador ingenuo que navegue por su base de datos de usuarios vea el "hash", se dé cuenta de la inseguridad de su aplicación y, eventualmente, haga del mundo un lugar mejor para todos.

Md5 genera 128 bits, que es de 16 bytes. Si tuviera un mensaje de 16 bytes, obtener la contraseña original en texto sin formato sería equivalente a una imagen previa, lo que a mi entender es prácticamente imposible. Sin embargo, solo estoy buscando 8 bytes específicos en mi hash.

¿Es factible obtener una contraseña de este tipo en marcos diurnos en una computadora típica? Si es así, ¿cómo puedo calcular esa contraseña?

    
pregunta Joel 22.04.2014 - 18:29
fuente

3 respuestas

256

La salida de MD5 es binaria: una secuencia de 128 bits, comúnmente codificada como 16 bytes (técnicamente, 16 octetos , pero usemos la convención común de bytes que son octetos).

Los humanos no leen bits o bytes. Ellos leen caracteres . Existen numerosas páginas de códigos que indican cómo codificar caracteres como bytes y, de manera similar, para decodificar bytes en caracteres. Para casi todos (debido a ASCII ), los bytes de bajo valor (0 a 31) son "caracteres de control" , por lo tanto no son realmente representables como personajes. Así que nadie realmente lee la salida MD5 directamente. Si alguien está "leyendo" los valores hash, entonces estos valores probablemente estén codificados en caracteres usando una de las pocas convenciones comunes para eso. Las dos convenciones más frecuentes son hexadecimal y Base64 .

Con hexadecimal, solo hay dígitos, y las letras 'a' a 'f' (tradicionalmente en minúsculas para valores hash). No obtendrás "SALT ME!" en una salida hexadecimal ...

Con Base64, la codificación usa las 26 letras latinas no acentuadas (tanto en minúscula como en mayúscula), los dígitos y los signos '+' y '/'. Por lo tanto, se puede esperar para "SaltMe" o "SALTME". Ahora eso es factible, porque cada carácter en Base64 codifica 6 bits, por lo que una salida de 6 letras corresponde a 36 bits solamente. La búsqueda de una contraseña que produzca "SaltMe" o "SALTME" se realizará en (en promedio) 235 intentos, es decir, en unos pocos minutos u horas con algunos decentes código optimizado.

Tenga en cuenta, sin embargo, que alguien que realmente dedica un tiempo a leer valores hash codificados en Base64 probablemente tenga algunos, digamos, "problemas sociales", y como tal no reaccione de la forma que usted espera.

Y se hace: cuando se hace hashing con MD5, se codifica en base64 el resultado:

  • infjfieq de rendimientos: SALTMEnBrODYbFY0c/tf+Q==
  • lakvqagi de rendimientos: SaltMe+neeRdUB6h99kOFQ==
respondido por el Tom Leek 22.04.2014 - 18:59
fuente
5

Puramente en teoría ...

Hay conjuntos de rainbow con hashes precalculados. Puede buscarlo para un valor de hash que contenga los valores de byte adecuados (EDIT: requeriría un forzamiento bruto de hashes completos de generación previa y un sondeo que lo hace mucho más difícil de hacer; consulte bonsaiviking's comment a la respuesta), si existe tal respuesta (por ejemplo, uno que contiene 0xBADBAD). Si existe uno, entonces, desde la propia tabla del arco iris, puede recuperar el texto sin formato del cual se derivó el hash (y si usa esa contraseña, entonces es, por definición, inseguro, ya que cualquiera que obtenga la base de datos puede revertirla). por lo que no se aconseja).

Sin embargo, en la práctica ....

Hay muchos supuestos en este enfoque.

  • En organizaciones de tamaño razonable, los desarrolladores normalmente no tienen acceso a la base de datos de producción, excepto quizás para casos de resolución de problemas individuales.
  • Está asumiendo que el MD5 se almacena / muestra en algún formato legible por humanos; sin embargo, es solo un conjunto de bytes de 16 bytes, y realmente dependería del software que el desarrollador / persona de TI utilizaría para visualizarlo. En Visual Studio, por ejemplo, el depurador mostraría la matriz de bytes generalmente por su valor numérico, por ejemplo. 87,45,34,67, ...
  • Está asumiendo que se está utilizando el MD5 sin sal, pero podría ser alguna otra función de hash, para la cual, obviamente, el hash sería diferente y, por lo tanto, no cumple con sus requisitos.
  • Y como otros ya han sugerido, no sabe cómo se almacena, ya que se le pueden haber aplicado algunas transformaciones adicionales (como Base64, por ejemplo) que lo harían parecer diferente.

Pero, principalmente, la suposición más grande es que alguien está buscando en la base de datos de miles / decenas de miles / millones / tenmillions / etc de usuarios y podría detectar el valor impar en un montón de hashes, e incluso luego en una parte de un hash.

    
respondido por el LB2 22.04.2014 - 19:07
fuente
1

8 bytes es de 64 bits, lo que está más allá de la fuerza bruta. No sé de ningún ataque de preimagen en md5, por lo que probablemente no tengas suerte.

También, algunos sitios web escapan o restringen su conjunto de caracteres como una medida (ineficaz) contra SQLI

    
respondido por el miniBill 22.04.2014 - 18:41
fuente

Lea otras preguntas en las etiquetas