¿Por qué el hash MD5 comienza desde $ 1 $ y SHA-512 desde $ 6 $? ¿No es debilidad en sí misma? [duplicar]

5

He movido esta pregunta de stackoverflow a este lugar. Sé que puede tratarse de una "opinión", pero no busco una opinión privada, sino una fuente de la decisión final para mantenerlo de esta manera.

Me han enseñado que nadie intenta abrir una puerta cuando uno no sabe que la puerta existe. La mejor defensa sería entonces esconder una puerta. Se podía ver fácilmente en las viejas películas de guerra, nadie mantendría un escondite en la luz. Siempre se cubrió con algo que sugiere que "no hay nada interesante allí".

Supondría que en la criptografía funcionaría de la misma manera. ¿Por qué entonces el hash generado por MD5 comenzó a partir de $ 1 $, y al decir qué es un hash en primer lugar, y luego qué tipo de hash es (MD5)?

Ahora, veo que sha512 hace exactamente lo mismo. ¿No es una debilidad por sí misma? ¿Hay alguna razón en particular por la que lo haríamos de esta manera?

La pregunta principal es: ¿Debo mezclar mi hash antes de almacenarlo para ocultarlo de un enemigo potencial? Si no hay necesidad de eso, ¿por qué?

Para evitar respuestas que sugieran que la oscuridad no es seguridad, propondría esta imagen. Es la segunda guerra mundial. Acabas de recibir un indicio de que SS está llegando a tu casa, sospechando que estás ocultando partidarios, y esto es cierto. No tienen tiempo para escapar. Tienes dos opciones donde puedes esconderlos: en la mejor caja fuerte del mundo, o en el agujero escondido debajo del piso, tan bien escondido que incluso tus padres no sospecharían que está allí. Cual es tu propuesta? ¿Te convencerías de que la mejor opción segura es la mejor?

Si sé que hay un tesoro escondido en una isla, me gustaría saber qué isla es o no comenzaré a buscar.

Todavía no estoy convencido. Chris Jester-Young hasta ahora me dio algo en qué pensar cuando sugirió que puede haber más algoritmos que generen el mismo hash a partir de diferentes datos.

    
pregunta Grzegorz 17.04.2014 - 00:34
fuente

3 respuestas

21

Primero, hay principio de Kerckhoffs que siempre es deseable:

  

Un criptosistema debe ser seguro, incluso si todo sobre el sistema, excepto la clave, es de conocimiento público.

donde en este caso la contraseña es la clave. Por lo tanto, no es un objetivo mantener el secreto del sistema de cifrado.

Segundo, estás equivocado acerca de los hash md5 o sha512; los valores almacenados en su /etc/shadow son md5crypt o sha512crypt, lo que implica un procedimiento de fortalecimiento (muchas rondas de un hash md5 o sha512).

Ahora, si sus cuatro opciones son MD5crypt, sha256crypt, sha512crypt y bcrypt (las opciones más populares en los sistemas Linux), aquí hay cuatro hashes generados con $saltsalt$ (o equivalente) como sal y hashing de la contraseña not my real password :

>>> import crypt
>>> crypt.crypt('not my real password','$1$saltsalt')
'$1$saltsalt$4iXfpnrgHRXkrDbPymCE4/'

>>> crypt.crypt('not my real password','$5$saltsalt')
'$5$saltsalt$E0bMpsLR71z8LIvd6p2tD4LZ984JxyD7B9lPLhq4vY7'

>>> crypt.crypt('not my real password','$6$saltsalt')
'$6$saltsalt$KnqiStSM0GULvZdkTBbiPUhoHemQ7Q06YnvuJ0PWWZbjzx3m0RCc/hCfq54Ro3fOwaJdEAliX9igT9DD2oN1u/'

>>> import bcrypt
>>> bcrypt.hashpw('not my real password', "$2a$12$saltsaltsaltsaltsalt..")
'$2a$12$saltsaltsaltsaltsalt..FW/kWpMA84AQoIE.Qg1Tk5.FKGpxBNC'

Incluso sin la anotación, es bastante sencillo averiguar qué esquema utilizan cada uno (md5crypt, sha256 crypt, sha512crypt y bcrypt tienen un tamaño de 34,55,98 y 60 caracteres respectivamente (en codificación base64 con anotación y sal)). Por lo tanto, a menos que sugiera truncar el hash o alterar las propiedades de hash, la anotación de coherencia no pierde seguridad. También le brinda un método para actualizar las contraseñas de los usuarios con gracia. Si decide que md5crypt ya no es seguro, puede cambiar de usuario. 'hashes to bcrypt en el próximo inicio de sesión (y luego, después de un período de tiempo, desactiva todas las cuentas que quedan en md5crypt). O si su algoritmo como bcrypt (cuando era $ 2 $) necesita actualizarse, debido a un falla en el diseño puede identificar fácilmente los esquemas defectuosos cuando el esquema fijo fue de $ 2a $.

Peor aún, podrías intentar decir que voy a modificar sha512 con nuevas constantes y teclas redondas. Eso lo haría muy difícil de romper, ¿verdad? No, solo hace que sea muy difícil para usted saber que no introdujo accidentalmente una vulnerabilidad importante. Si pueden acceder a su / etc / shadow, es probable que también puedan acceder a la biblioteca utilizada para iniciar sesión y, con el tiempo, podrían realizar una ingeniería inversa de su esquema de hash y esto será MUCHO más sencillo que romper una contraseña segura.

Nuevamente, el tiempo esperado para la fuerza bruta de una frase de contraseña muy fuerte almacenada en el hash sha256 es O (2 ^ 256), por ejemplo, un billón de computadoras que hacen un billón de sha256 crypts por nanosegundo (cada uno implica ~ 5000 rondas de sha256), tomaría 30000000000000000000000000 (3 x 10 ^ 23) veces la edad del universo para romperlo. Y con sha512 crypt, si cada uno de los ~ 10 ^ 80 átomos en el universo observable hiciera mil millones de sha512 crypts cada nanosegundo, todavía tomaría 10 ^ 38 veces la edad del universo. (Esto supone que tiene una frase de contraseña de entropía de 256 bits y 512 bits o superior).

    
respondido por el dr jimbob 17.04.2014 - 03:42
fuente
4

La ocultación de qué hash se utiliza hace que sea imposible que el sistema autentique la contraseña de un usuario legítimo.

Cuando se inventó por primera vez la autenticación de contraseña a través de hash en Unix, la función de hash de contraseña estaba codificada para usar el DES (ahora está desactualizado). Si el hash de la contraseña se deriva de cualquier otra función, debe haber un identificador para permitir que el sistema reconozca qué algoritmo se utilizó para generar el hash.

Esto se debe a que el hashing de contraseñas es una función de un solo sentido. He oído decir que esperar ejecutar una función unidireccional a la inversa es como esperar ejecutar una fábrica de salchichas al revés y que los cerdos salgan por el otro extremo. Entonces, cuando va a autenticar a alguien que inicia sesión en el sistema, solo puede ejecutar la función de hash y comparar los resultados con lo que está almacenado en / etc / shadow.

Por lo tanto, esos identificadores tienen que permanecer en el claro, de lo contrario se usará la función de hashing incorrecta, los hashes no coincidirán y nadie podrá ingresar al sistema.

    
respondido por el Mike McManus 17.04.2014 - 01:10
fuente
1

Intentar ocultar la implementación del hash es simplemente mover el problema, de

  • Puedo ver por protocolo que la función hash es X ()

a

  • Mirando el código **, puedo decir que la función hash es X ()

** (u otro canal de información lateral)

Si su atacante tiene alguna forma de probar el sistema, es casi seguro que podrá descubrir el algoritmo que está usando. Lo más fácil es simplemente mirar el código (código fuente o código de máquina), los métodos más complicados incluyen el uso de mediciones de tiempo para diferenciar la función que se está utilizando. Para usar tu analogía de "ocultar a la gente", todo lo que necesito es que me acerque con un equipo de sonido y Puedo decir que incluso antes de entrar al edificio hay habitaciones subterráneas.

Sé que no querías escucharlo, pero la realidad es que "La seguridad a través de la oscuridad" falla inevitablemente debido a una incapacidad para oscurecer lo suficiente, desde todos los enfoques posibles, ambos enfoques conocidos hoy, o algún enfoque futuro. p>     

respondido por el Shawn C 17.04.2014 - 00:44
fuente

Lea otras preguntas en las etiquetas