¿Cuál es la diferencia entre la función de derivación de claves y el hash (con sal)?

2

Lo veo en este post de que la principal diferencia es que los resultados de KDF tienen "ciertas propiedades de aleatoriedad", y no entiendo qué significa. Suponiendo que "ciertas propiedades de aleatoriedad" son para proteger de las tablas de arco iris y esas cosas precalculadas.

Pero al usar hash con la salazón adecuada también podemos protegernos de esos ataques. Entonces, en ese sentido, creo que no hay diferencia entre estas dos herramientas, que difieren solo en la implementación.

También sé que otro objetivo del KDF es ser suficiente lento para frenar ataques hipotéticos, sin dañar la experiencia del usuario en términos de velocidad. Bueno, en el sentido estricto, esto también podría lograrse al agregar hashing algunas operaciones inútiles (por ejemplo, for(i = 0; i < 1000000; i++); ), incluso si no estuvieran muy limpias.

Entonces, ¿cuál es la diferencia? ¿Es uno mejor que otro? ¿Cuándo tendríamos que usar uno y cuándo el otro?

    
pregunta Julen 31.07.2015 - 00:33
fuente

1 respuesta

3

En realidad hay dos tipos de KDF. Un tipo está diseñado para derivar una clave de la entrada de alta entropía (como otra clave); Esto se puede hacer con un hash de clave rápida como HMAC. El otro tipo toma una contraseña como entrada. Las contraseñas son de baja entropía; No son inherentemente muy difíciles de fuerza bruta. Un buen hash de contraseña debe ser lento.

En tu pregunta, dijiste que agregar for (i=0; i<bignum; i++); ralentizaría el hash. Esto es en realidad completamente inútil. El atacante no tiene que jugar según tus reglas. Los hash deben proteger las contraseñas cuando los atacantes tienen una copia de los hashes. Si el atacante puede calcular hashes rápidamente, no importa cuán lentamente usted los calcule. Los hash deben ser inherentemente lentos; no debe haber accesos directos para evaluarlos más rápido que el servidor legítimo.

Las "propiedades de aleatoriedad" se deben a que un KDF necesita producir una clave. No tienen nada que ver con la precomputación, incluidas las tablas de arco iris. Los algoritmos criptográficos generalmente hacen ciertas suposiciones acerca de la clave; entre otras cosas, normalmente asumen que se seleccionó totalmente al azar del conjunto de claves posibles. También se espera que las llaves tengan una cierta longitud; sus funciones de derivación necesitan una salida de longitud arbitraria. En contraste, está bien si un hash de contraseña tiene mucha estructura en la salida. Tal vez hay un 70% de probabilidad de que los bits adyacentes tengan el mismo valor. Tal vez se extiende 128 bits de entropía en 4096 bits de salida. Mientras sea difícil de revertir, es un buen hash, pero no es adecuado como clave.

Una función de derivación de clave segura basada en contraseña es un hash de contraseña seguro (PBKDF2 es de hecho uno de los 3 hashes grandes). Lo contrario no es necesariamente cierto. Cuál usar es simple: use una función de derivación de clave basada en contraseña para obtener una clave de una contraseña y un hash para almacenar contraseñas.

    
respondido por el cpast 31.07.2015 - 01:52
fuente

Lea otras preguntas en las etiquetas