Saltar al contenido

¿Por qué no es posible revertir un hash criptográfico?

Te damos la bienvenida a nuestra web, ahora encontrarás la respuesta de lo que buscabas.

Solución:

MD5 está diseñado para ser criptográficamente irreversible. En este caso, la propiedad más importante es que es computacionalmente inviable encontrar el reverso de un hash, pero es fácil encontrar el hash de cualquier dato. Por ejemplo, pensemos en simplemente operar con números (los archivos binarios, después de todo, podrían interpretarse como un número muy largo).

Digamos que tenemos el número “7”, y queremos sacarle el hash. Quizás lo primero que intentamos como función hash es “multiplicar por dos”. Como veremos, esta no es una función hash muy buena, pero la probaremos para ilustrar un punto. En este caso, el hash del número será “14”. Eso fue bastante fácil de calcular. Pero ahora, si nos fijamos en lo difícil que es revertirlo, ¡nos damos cuenta de que también es igual de fácil! Dado cualquier hash, ¡podemos dividirlo por dos para obtener el número original! Este no es un buen hash, porque el objetivo de un hash es que es mucho más difícil calcular la inversa que calcular el hash (esta es la propiedad más importante en al menos algunos contextos).

Ahora, probemos con otro hash. Para este, tendré que introducir la idea de la aritmética del reloj. En un reloj, no hay una cantidad infinita de números. De hecho, solo va de 0 a 11 (recuerde, 0 y 12 son lo mismo en un reloj). Entonces, si “agrega uno” a 11, simplemente obtiene cero. Puede extender las ideas de multiplicación, suma y potenciación a un reloj. Por ejemplo, 8 + 7 = 15, ¡pero 15 en un reloj son realmente solo 3! Entonces, en un reloj, ¡dirías 8 + 7 = 3! 6 * 6 = 36, pero en un reloj, ¡36 = 0! entonces 6 * 6 = 0! Ahora, para el concepto de poderes, puedes hacer lo mismo. 2 ^ 4 = 16, pero 16 es solo 4. ¡Entonces 2 ^ 4 = 4! Ahora, así es como se relaciona con el hash. ¿Qué tal si probamos la función hash f (x) = 5 ^ x, pero con aritmética de reloj? Como verá, esto conduce a algunos resultados interesantes. Intentemos tomar el hash de 7 como antes.

Vemos que 5 ^ 7 = 78125, pero en un reloj, eso es solo 5 (si hace los cálculos, verá que hemos dado la vuelta al reloj 6510 veces). Entonces obtenemos f (7) = 5. Ahora, la pregunta es, si te dijera que el hash de mi número es 5, ¿podrías averiguar que mi número es 7? Bueno, en realidad es muy Es difícil calcular el reverso de esta función en el caso general. Personas mucho más inteligentes que yo han demostrado que, en ciertos casos, invertir esta función es camino más difícil que calcularlo hacia adelante. (EDITAR: Nemo ha señalado que esto, de hecho, no ha sido “probado”; de hecho, la única garantía que obtienes es que muchas personas inteligentes han intentado durante mucho tiempo encontrar una manera fácil de hacerlo, y ninguna de ellos han tenido éxito.) El problema de invertir esta operación se denomina “Problema de logaritmo discreto”. Búscalo para obtener una cobertura más detallada. Este es al menos el comienzo de una bien función hash.

Con las funciones hash del mundo real, la idea es básicamente la misma: encuentras alguna función que es difícil de revertir. Personas mucho más inteligentes que yo han diseñado MD5 y otros hashes para hacerlos probablemente difíciles de revertir.

Ahora, tal vez antes se le ocurrió la idea: “¡sería fácil calcular el inverso! ¡Simplemente tomaría el hash de cada número hasta encontrar el que coincida!” Ahora, para el caso en el que todos los números sean menores que doce, esto sería factible. Pero para el análogo de una función hash del mundo real, imagine que todos los números involucrados son enorme. La idea es que todavía es relativamente fácil calcular la función hash para estos números grandes, pero buscar en todas las entradas posibles se vuelve más difícil y mucho más rápido. Pero con lo que te has topado es que sigue siendo una idea muy importante: buscar en el espacio de entrada una entrada que dé una salida coincidente. Las tablas de arco iris son una variación más compleja de la idea, que utilizan tablas precalculadas de pares de entrada-salida de manera inteligente para hacer posible la búsqueda rápida a través de una gran cantidad de entradas posibles.

Ahora digamos que está utilizando una función hash para almacenar contraseñas en su computadora. La idea es esta: la computadora simplemente almacena el hash de la contraseña correcta. Cuando un usuario intenta iniciar sesión, compara el hash de la contraseña de entrada con el hash de la contraseña correcta. Si coinciden, asume que el usuario tiene la contraseña correcta. La razón por la que esto es ventajoso es porque si alguien roba su computadora, todavía no tiene acceso a su contraseña, solo el hash de la misma. Debido a que la función hash fue diseñada por personas inteligentes para que sea difícil tomar lo contrario, no pueden recuperar fácilmente su contraseña.

La mejor apuesta de un atacante es un ataque de fuerza bruta, en el que prueban un montón de contraseñas. Al igual que podría probar los números menores que 12 en el problema anterior, un atacante podría probar todas las contraseñas compuestas simplemente por números y letras de menos de 7 caracteres, o todas las palabras que aparecen en el diccionario. Lo importante aquí es que no puede intentar todos posibles contraseñas, porque hay demasiadas contraseñas posibles de 16 caracteres, por ejemplo, para siempre prueba. Entonces, el punto es que un atacante tiene que restringir las posibles contraseñas que prueba, de lo contrario nunca verificará ni siquiera un pequeño porcentaje de ellas.

Ahora, en cuanto a una sal, la idea es esta: ¿y si dos usuarios tuvieran la misma contraseña? Tendrían el mismo hash. Si lo piensa bien, el atacante no tiene que descifrar la contraseña de cada usuario individualmente. Simplemente revisa todas las contraseñas de entrada posibles y compara el hash con todos los hash. Si coincide con uno de ellos, entonces ha encontrado una nueva contraseña. Lo que realmente nos gustaría obligarlo a hacer es calcular un nuevo hash para cada combinación de usuario + contraseña que quiere comprobar. Esa es la idea de una sal, es que haces que la función hash sea ligeramente diferente para cada usuario, por lo que no puede reutilizar un solo conjunto de valores precalculados para todos los usuarios. La forma más sencilla de hacer esto es agregar algunos string a la contraseña de cada usuario antes de tomar el hash, donde el azar string es diferente para cada usuario. Entonces, por ejemplo, si mi contraseña es “shittypassword”, mi hash podría aparecer como MD5 (“6n93nshittypassword”) y si su contraseña es “shittypassword”, su hash podría aparecer como MD5 (“fa9elshittypassword”). Este pequeño “fa9el” se llama “salt” y es diferente para cada usuario. Por ejemplo, mi sal es “6n93n”. Ahora, esta pequeña parte que está agregada a su contraseña también se almacena en su computadora. Cuando intenta iniciar sesión con la contraseña X, la computadora puede simplemente calcular MD5 (“fa9el” + X) y ver si coincide con el hash almacenado.

Por lo tanto, la mecánica básica del inicio de sesión permanece sin cambios, pero para un atacante, ahora se enfrenta a un desafío más abrumador: en lugar de una lista de hashes MD5, se enfrenta a una lista de sumas y sales MD5. Básicamente tienen dos opciones:

  1. Pueden ignorar el hecho de que los hashes están salados e intentar descifrar las contraseñas con su tabla de búsqueda tal como están. Sin embargo, las posibilidades de que descifren una contraseña se reducen mucho. Por ejemplo, incluso si “shittypassword” está en su lista de entradas para verificar, lo más probable es que “fa9elshittypassword” no lo esté. Para obtener incluso un pequeño porcentaje de la probabilidad de descifrar una contraseña que tenían antes, necesitarán probar órdenes de magnitud más contraseñas posibles.

  2. Pueden volver a calcular los valores hash por usuario. Entonces, en lugar de calcular MD5 (contraseña adivina), para cada usuario X, calculan MD5 (Salt_of_user_X + contraseña adivina). Esto no solo los obliga a calcular un nuevo hash para cada usuario que quieran descifrar, sino que también, lo más importante, les impide poder usar tablas precalculadas (como la tabla de arco iris, por ejemplo), porque no pueden saber qué Salt_of_user_X está de antemano, por lo que no pueden calcular previamente los hashes para probar.

Básicamente, si están tratando de usar tablas precalculadas, usar una sal efectivamente aumenta considerablemente las posibles entradas que tienen que probar para descifrar la contraseña, e incluso si no están usando tablas precalculadas, aún las ralentiza en un factor de N, donde N es la cantidad de contraseñas que está almacenando.

Esperamos que esto responda a todas sus preguntas.

Piense en 2 números del 1 al 9999. Súmelos. Ahora dime el dígito final.

No puedo, a partir de esa información, deducir en qué números pensó originalmente. Ese es un ejemplo muy simple de hash unidireccional.

Ahora yo pueden piense en dos números que den el mismo resultado, y aquí es donde este ejemplo simple difiere de un hash criptográfico “adecuado” como MD5 o SHA1. Con esos algoritmos, debería ser computacionalmente difícil encontrar una entrada que produzca un hash específico.

Una gran razón por la que no puede revertir la función hash es porque se pierden datos.

Considere una función de ejemplo simple: ‘OR’. Si aplica eso a sus datos de entrada de 1 y 0, se obtiene 1. Pero ahora, si sabe que la respuesta es ‘1’, ¿cómo puede retroceder los datos originales? No puedes. Podría haber sido 1,1 o quizás 0,1, o quizás 1,0.

En cuanto a las tablas de salazón y arcoiris. Sí, en teoría, podría tener una tabla de arco iris que abarcaría todas las sales y contraseñas posibles, pero en la práctica, eso es demasiado grande. Si probó todas las combinaciones posibles de letras minúsculas, mayúsculas, números y doce símbolos de puntuación, hasta 50 caracteres, eso es (26 + 26 + 10 + 12) ^ 50 = 2.9 x 10 ^ 93 posibilidades diferentes. Eso es más que la cantidad de átomos en el universo visible.

La idea detrás de las tablas de arco iris es calcular el hash para un montón de posibles contraseñas por adelantado, y las contraseñas tienen mucho menos de 50 caracteres, por lo que es posible hacerlo. Es por eso que desea agregar una sal al frente: si agrega ’57sjflk43380h4ljs9flj4ay’ al frente de la contraseña. Si bien es posible que alguien ya haya calculado el hash para “pa55w0rd”, nadie habrá calculado ya el has para ’57sjflk43380h4ljs9flj4aypa55w0rd’.

Te mostramos reseñas y valoraciones

Puedes ayudar nuestra investigación fijando un comentario y valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *