Key estirando un hash

2

Si implemento una función que contiene la primera mitad de mi contraseña con MD5 y la segunda mitad con SHA-2 y MD5, ¿hay algún problema de seguridad al unir estos dos hashes para crear una cadena de 64 caracteres? p>

Example:
Password: "test123"

first_half: md5(test+salt1);
second_half: sha2(md5(123)+salt2);
hash = first_half + second_half 

Me gustaría usar algo como esto para estirar el hash, para que los atacantes no sepan qué tipo de hash usé. Así que las tablas de arco iris estándar serán inútiles. Además, no habrá colisiones estándar de MD5, porque tiene más caracteres. Estoy en lo correcto?

    
pregunta Vilican 15.11.2012 - 10:14
fuente

3 respuestas

10

No. Sería trivial para ellos simplemente tomar cada parte y aplicar fuerza bruta, incluso para contraseñas seguras. Está cayendo en el mismo problema que NTLM en los primeros días, donde una contraseña larga termina siendo dos contraseñas realmente cortas que son fáciles de usar de forma independiente de la fuerza bruta.

En lugar de tener que descifrar una contraseña de 10 caracteres (suponiendo que az 0-9 es un espacio clave de 3.656 × 10 13 ), solo tienen que descifrar dos contraseñas de 5 caracteres (espacio clave de 120,932,352 para el mismo contraseña) haciendo el problema varios órdenes de magnitud más fácil para ellos.

Si estás buscando contraseñas de hash, usa un algoritmo de derivación de clave fuerte como bcrypt o PBKDF2.

Recomiendo leer estas dos preguntas en Seguridad de TI:

respondido por el Polynomial 15.11.2012 - 11:46
fuente
5

La división de la contraseña es mala.

El diseño de su propio mecanismo de hashing de contraseñas tampoco es bueno. Está bien para fines de aprendizaje, pero para la producción, esto es un no-go, porque no puede saber si hizo las cosas bien o no . Es un defecto genérico y global de la criptografía casera. De toda la criptografía, en realidad; pero, al menos, con estándares públicos como bcrypt , se beneficia de la revisión de muchos ojos durante muchos años.

Dices que los atacantes "no sabrán el tipo de hash que usaste". Eso está mal; Ya lo saben, probablemente mejor que tú. En primer lugar, tienen acceso a Internet, por lo que pueden leer esta pregunta que hacen en StackExchange. Además, el método de hashing existe como código fuente en algún lugar, y algún script ejecutable o binario en su servidor, por lo que no puede ser realmente secreto. En particular, desea hacer un hash de las contraseñas antes de almacenarlas porque imagina que un atacante podría obtener un acceso de solo lectura ilegal a los datos almacenados por el servidor (de lo contrario, no tendría que hacerlos). ; es muy concebible que un atacante de este tipo también obtenga acceso de solo lectura al código del servidor en sí mismo y, por lo tanto, obtenga conocimiento del método de hashing que utiliza.

Por último, pero no menos importante, no puedes saber cuánto tu algoritmo hash es secreto. Gran parte de la seguridad se trata de cuantificar y medir. Con una contraseña, puede estimar la entropía , dependiendo del mecanismo de generación; lo mismo para cualquier clave secreta: las claves viven en un espacio de un tamaño que se puede evaluar a través de las matemáticas. Pero, ¿el secreto de un algoritmo , que existe en varios lugares, incluido el código fuente, ejecutables, hojas impresas, copias de seguridad y el cerebro de algunos desarrolladores? ¿Cuánto secreto puede ser?

Kerckhoff lo explicó claramente hace más de un siglo: no debe considerar su sistema como secreto. Las claves (y las contraseñas, que son solo un tipo de clave) están diseñadas para concentrar el secreto, mientras que el resto del algoritmo debe considerarse público, porque, la mayoría de las veces, es conocimiento público.

    
respondido por el Thomas Pornin 15.11.2012 - 15:50
fuente
-2

En la práctica, he visto hacer esto incluso para los usuarios en bases de datos, por ejemplo, para ocultar la información de usuario de los menores, incluso para su nombre de inicio de sesión. Si recuerdo bien, fue algo como [email protected]. Lo mismo podría usarse para las contraseñas, y supongo que si estuvieras preocupado por mantener esas cadenas en la base de datos, podrías hacer un Xor algunas veces (por lo que es un poco más rápido calcular 100 o 1000x) y ser "no tan" fácilmente reversible ... p.ej.

(Sha1 xor Sha2 xor md5) * CRC32 

El CRC32 es solo por diversión, pero puede usar un cambio a la izquierda o derecha antes que los operadores de bits si lo desea.

Espero que ayude!

    
respondido por el Jeremy Adsitt 15.11.2012 - 11:40
fuente

Lea otras preguntas en las etiquetas