Pregunta:
¿Por qué los KDF son lentos? ¿Es más seguro usar un KDF que usar el secreto original?
mngxyuiso
2019-10-04 23:20:41 UTC
view on stackexchange narkive permalink

De acuerdo con la página de Wikipedia para funciones de derivación de claves, el propósito de un KDF es derivar una clave secreta para la criptografía:

En criptografía, una función de derivación de claves ( KDF) deriva una o más claves secretas a partir de un valor secreto como una clave maestra, una contraseña o una frase de contraseña utilizando una función pseudoaleatoria. [1] [2] Los KDF se pueden usar para estirar claves en claves más largas o para obtener claves de un formato requerido, como convertir un elemento de grupo que es el resultado de un intercambio de claves Diffie-Hellman en una clave simétrica para usar con AES. Las funciones hash criptográficas con clave son ejemplos populares de funciones pseudoaleatorias utilizadas para la derivación de claves. [3]

Supongamos que acabamos de completar un intercambio de claves Curve25519 y queremos usar la clave para un algoritmo simétrico , p.ej AES.

  • Si el secreto compartido en bruto puede usarse como clave para el cifrado simétrico, ¿el uso de un KDF proporciona algún beneficio de seguridad? (Suponiendo que la salida del KDF también se puede usar en el cifrado simétrico.
  • Si el secreto en bruto no se puede usar como clave para el cifrado, le aplicamos un KDF. En este caso, ¿por qué el ¿KDF tiene que ser lento? (¿O esta propiedad de un KDF es solo para casos específicos, pero no este?)
Son lentos para reducir la efectividad de los intentos de fuerza bruta.Si solo pueden adivinar una vez por segundo, por CPU que estén usando, les llevará más tiempo adivinar el secreto correcto que si pudieran adivinar cientos de miles de veces por segundo por CPU.
¿Eso realmente importa si se desconoce la clave?P.ej.si realizamos un intercambio de claves, el adversario tiene un rango de valores posibles del secreto ECC y un rango de valores PBKDF.Si estamos usando una clave derivada de KDF _K_, entonces encontrar la preimagen del KDF-ed no importa, ¿verdad?Lo único que importa es encontrar la clave utilizada.
Los secretos suelen ser de baja entropía, como las contraseñas.
@mngxyuiso Sí, podría intentar forzar la clave derivada en su lugar.Pero esa clave debe ser tan grande que la fuerza bruta sea infructuosa
Tres respuestas:
Luis Casillas
2019-10-05 01:53:13 UTC
view on stackexchange narkive permalink

La confusión aquí es que hay dos tipos distintos de funciones de generación de claves, y la gente suele decir "función de derivación de claves" sin ser explícito a cuál se refieren (o incluso entender que hay dos):

  • Funciones de derivación de claves basadas en claves
  • Funciones de derivación de claves basadas en contraseñas

Una función de derivación basada en claves como HKDF presupone que las entradas pueden estar sesgadas o parcialmente predecible, pero que de lo contrario tiene suficiente min-entropía para ser confiablemente imposible de adivinar. El secreto compartido producido por un intercambio Diffie-Hellman es uno de los ejemplos de libros de texto.

Las funciones basadas en contraseñas, por otro lado, asumen que las entradas tienen baja entropía y, por lo tanto, están diseñadas para imponer un costo tan alto como razonable para un ataque de adivinanzas (sin volverse insoportablemente costoso para las partes honestas). Ralentizar el cálculo al tener un gran número de iteraciones es la técnica clásica, pero las funciones más nuevas como scrypt y Argon2 van más allá y apuntan a ser memory-hard:

  • El algoritmo canónico para calcularlos usa una gran cantidad de memoria ajustable;
  • Cualquier algoritmo para calcular la función que use menos memoria que el canónico debe pagar una penalización de tiempo muy alta (tiempo adverso -compensa de memoria ).
Stephen Touset
2019-10-04 23:35:31 UTC
view on stackexchange narkive permalink

¡No todos los KDF son lentos! Algo como HKDF es extremadamente rápido y solo implica un puñado de invocaciones al PRF subyacente.

Los KDF solo son lentos cuando están destinados a convertir una entrada de entropía potencialmente baja —Como una contraseña— a una salida de alta entropía, como una clave de cifrado o un verificador de contraseñas. En este escenario, tales funciones están diseñadas para ser lentas con el fin de agregar tiempo de cálculo como si el atacante estuviera tratando de forzar un secreto con una entropía más alta que la que realmente se usa.

Para algo así como un secreto compartido después de un intercambio de claves Curve25519, generalmente preferiría un KDF rápido. Por ejemplo, el marco del protocolo de ruido utiliza HDKF para generar claves de cifrado a partir de un secreto compartido derivado de la multiplicación de curvas. Si bien puede usar un secreto compartido sin procesar como clave directamente, la mayoría de los protocolos en la práctica usan alguna forma de KDF para permitir funciones como el secreto directo.

¿Es realmente posible convertir una entrada de baja entropía en una salida de alta entropía?Se refiere a un formato de salida que permitiría una alta entropía, o una salida * potencialmente * de alta entropía, ¿verdad?
"Depende".En un sentido matemático muy estricto, no.En un sentido * práctico * con computadoras físicas construidas a partir de la materia y que existen en el espacio-tiempo, sí.La idea es que incluso algunas entradas pueden tener `n` bits de entropía, el estiramiento de claves aumenta la cantidad de trabajo real necesario para enumerar y probar cada suposición.Si la cantidad de trabajo requerida para cada conjetura es `2 ^ m` veces la cantidad de trabajo que se habría necesitado sin el estiramiento de la clave, la entropía efectiva es` n + m` bits.
Damon
2019-10-06 01:21:32 UTC
view on stackexchange narkive permalink

La razón por la que usa un KDF, o un hash seguro para el caso, en una clave compartida curve25519 es que los bits no se distribuyen aleatoriamente. Tiene 32 bytes de "datos puntuales" que contienen aproximadamente 126 bits de "seguridad".

Entonces ... ¿qué bits elige? ¿Tomar los primeros 126 bits y dejar los 2 bits restantes de su clave de 128 bits en cero? ¿O tomar los últimos 126 bits? ¿O simplemente saca 128 bits del medio? ¿Alguna otra estrategia? ¿Cómo sabe que eligió las partes correctas? ¿Cómo saber que no existen patrones explotables?
El uso de un hash seguro o KDF resuelve todos estos problemas. Algo-algo-entrada da 128 bits de salida bastante-perfectamente-aleatoria (o más bien, de apariencia aleatoria). O cualquier otra cantidad de bits que desee. No desperdicia entropía, no necesita preocuparse si eligió los bits "buenos" y no se arriesga a tener patrones obvios y posiblemente explotables que provengan de los cálculos del ECC (que no son perfectamente "aleatorios"). Por supuesto, la entropía no se agregará "mágicamente" si se estira, pero el punto es que un observador externo no puede decir dónde está. El KDF o hash no necesita ser lento (y la mayoría de las veces no debería serlo ).

La razón por la que usa un hash lento o KDF en las contraseñas o cualquier otra entrada del usuario es que cualquier cosa que provenga de un humano tiene una entropía vergonzosamente pobre y está sujeta a ser forzada brutalmente con la ayuda de un diccionario (más permutaciones obvias). Las computadoras modernas pueden literalmente hacer cientos de millones de hash simples por segundo, por lo que eso es un problema si su base de datos de contraseñas es robada. Es posible que el atacante no rompa la base de datos completa, pero obtener las contraseñas de algunos usuarios es cuestión de una fracción de segundo si no se utiliza una función deliberadamente lenta. Cuanto más tiempo le tome a un posible atacante, mejor. Más trabajo necesario para romper una contraseña significa que tiene más tiempo para reaccionar e informar a los usuarios en caso de una violación.

Lo mismo ocurre, por ejemplo, acceso a su disco cifrado o su archivo Keepass. Si un atacante puede probar de 100 a 200 millones de contraseñas por segundo, es posible que no cifre en absoluto, no importa cuánto cuidado ponga en elegir una buena contraseña.
Si un atacante puede probar de 3 a 4 contraseñas por segundo porque ese es el tiempo que lleva ejecutar el KDF, su contraseña es básicamente "irrompible" porque se tarda una eternidad en encontrar una coincidencia a esa velocidad.

Ciertamente, esto también lo hace más costoso para usted para desbloquear su volumen. Sin embargo, solo lo hace una vez , un atacante debe hacerlo muchas veces .



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 4.0 bajo la que se distribuye.
Loading...