¿Cómo saber qué longitud de salida solicitar al PBKDF2?

5

Siento que estoy haciendo una pregunta bastante obvia aquí, pero como es tan fácil cometer errores en este espacio, aquí va.

De wikipedia :

  

DK = PBKDF2 (PRF, Contraseña, Salt, c, dkLen)

     

dkLen es la longitud deseada de la clave derivada

¿Cómo decido cuál es la "longitud deseada"?

    
pregunta user50849 10.03.2014 - 22:24
fuente

2 respuestas

6

La longitud de salida para PBKDF2 es lo que necesita . Pero hay detalles.

PBKDF2 es una Función de Derivación de Clave : produce una secuencia de bytes de longitud configurable , cuyo propósito es ser utilizado como claves para algún algoritmo de cifrado simétrico (o MAC). Entonces, una primera respuesta es: si desea usar un algoritmo de cifrado simétrico que espera, digamos, una clave de 19 bytes, entonces quiere 19 bytes fuera de PBKDF2.

Ahora para los detalles:

  • PBKDF2 tiene un inconveniente, ya que produce datos por bloques, y tiene un costo proporcional a la cantidad de bloques que solicita. Por ejemplo, si usa PBKDF2 con HMAC / SHA-1 como PRF interno (ese es el caso habitual), entonces obtiene bytes por bloques de 20. Si quiere, digamos, 24 bytes, entonces PBKDF2 tendrá que producir dos bloques, y esto será el doble de caro como si quisieras 20 bytes o menos.

    Esto es desafortunado porque PBKDF2 es intencionalmente lento, para anular la búsqueda exhaustiva de la contraseña. Sin embargo, dependiendo de cómo use la salida PBKDF2, el atacante podría "probar" una contraseña en el primer bloque de la salida PBKDF2 solamente; en efecto, esto puede dar un aumento de rendimiento x2 o x3 al atacante, que es contraproducente.

    La solución alternativa sugerida es producir un bloque de salida con PBKDF2 (por ejemplo, 20 bytes), luego expandir estos 20 bytes con otro KDF rápido, a tantos bytes como sea necesario. HKDF es un KDF rápido con buena reputación.

  • PBKDF2 se usa con frecuencia en hash de contraseña . Con el hashing de contraseñas, realmente no usa la salida, simplemente la almacena para una comparación ulterior. Para tal uso, debe almacenar suficientes bytes para que los atacantes no tengan "suerte": encontrar una salida que coincida con lo que estaba almacenado debería ser abrumadoramente improbable. Si usa PBKDF2 para el hashing de contraseñas, entonces 12 bytes de salida deberían estar bien, con un margen de seguridad no despreciable.

respondido por el Thomas Pornin 21.05.2014 - 20:18
fuente
4

Si está utilizando la salida para el hashing de contraseñas, entonces la longitud de salida:

  • no debe ser mayor que el tamaño de salida del hash nativo
    • SHA-1 es 20 bytes, SHA-224 es 28 bytes, SHA-256 es 32 bytes, SHA-384 es 48 bytes, SHA-512 es 64 bytes
  • No debe ser inferior a su tolerancia al riesgo. En la práctica, diría que cualquier cosa inferior a 20 bytes (tamaño de salida nativo SHA-1) es demasiado pequeño.

Si está utilizando la salida directamente como una sola clave de cifrado:

  • Debe ser igual al tamaño de la clave de cifrado que necesita
    • Lo ideal es que no sea más que el tamaño de salida del hash nativo (ver arriba)

Si está utilizando la salida como una clave de cifrado y una MAC, o en cualquier otro caso en el que esté utilizando la salida para más de un propósito:

El motivo de "no más que el tamaño de salida del hash nativo" es que RFC2898 sección 5.2, en el Definición de PBKDF2, especifica que si se solicitan más bytes de salida (dkLen) que los que proporciona la función hash nativa, realiza un recuento de iteraciones completas para el primer tamaño de hash nativo, luego otra cuenta de iteraciones completas para el segundo y continúa hasta que haya terminado o tiene que truncar la salida porque el resto de lo que necesita es menor que el tamaño de salida nativo.

    
respondido por el Anti-weakpasswords 22.03.2014 - 17:53
fuente

Lea otras preguntas en las etiquetas