PBKDF2 utilizado para generar una clave de cifrado: secreto compartido de larga data (contraseña) contra el número de iteraciones

2

Quiero usar pbkdf2 para generar una clave para un algoritmo de cifrado simétrico (DES, 3DES, puede ser AES), que se utilizará para proteger datos privados entre un AS / 400 y otra computadora (probablemente con Windows).

He estado "portando" el código fuente de pbkdf2 c desde un repositorio de FreeBSD a un AS / 400 (AKA como iSeries o Power system), que por cierto no es un gran problema.

También he compilado el mismo código en un sistema Windows (con Visual Studio 2012) (Para aquellos que puedan estar interesados, existe una API que implementa PBKDF2 en Windows 7 y Win2008R2: BCryptDeriveKeyPBKDF2 ())

El rendimiento parece ser lo suficientemente bueno en Windows (admito que la máquina de Windows no es una "máquina lenta" en el momento de escribir: Asus R751L, Intel Core i7-4500U, 16 GB de RAM): Con contraseña="abcd", sal="algo de sal" (usaré un valor aleatorio de 64 bits o más si es necesario en la aplicación real), Aquí hay algunas veces para varias iteraciones (c):

  • c = 1000 = > 31 ms (no optimizado), 15 ms (optimizado para velocidad)
  • c = 10000 = > 320 ms (no optimizado), 94 ms (optimizado para velocidad)
  • c = 100000 = > 3280 ms (no optimizado), 880 ms (optimizado para velocidad)

(Para su información, la API BCryptDeriveKeyPBKDF2 () proporciona resultados ligeramente mejores que la versión que he compilado, pero este no es mi problema)

Ahora el problema es la velocidad de ejecución que obtengo con el sistema AS / 400:

  • c = 1000 = > 12590ms (no optimizado), 2946ms (optimizado)
  • c = 10000 = > 125889ms (no optimizado), 29452ms (optimizado)
  • c = 100000 = > (no lo he intentado ...)

Mi AS / 400 no es un sistema muy potente, pero incluso la versión optimizada es muy lenta ...

Hasta ahora, he leído que el parámetro "c" (recuento de iteraciones) debería ser lo más alto posible, siendo 1000 el valor mínimo recomendado para "c" en la década de 2000 ... y que hay que encontrar una compensación entre rendimiento aceptable y seguridad, de acuerdo con los sistemas involucrados; en mi caso, c = 1000 ya lleva demasiado tiempo para ser computado en mi opinión, por varias razones:

  • Reponsividad de la aplicación,
  • posibles ataques de DOS,
  • ...

Ahora me pregunto: ¿puede un secreto compartido largo y / o complicado ser una solución para mantener "c" lo más pequeño posible sin "perder" demasiada "seguridad"? (1000 para "c" ya es demasiado lento, por lo que me gustaría usar c = 100 puede ser ...)

¿Hay algún tipo de regla, como "agregar n caracteres a la contraseña es algo equivalente a aumentar el número de iteraciones (c) de x?

¿Incrementar el tamaño de la sal (por ejemplo, 128 bits o más en lugar de 64 bits) aumenta la dificultad para volver a los datos originales de un cracker?

    
pregunta ggo 28.09.2014 - 11:31
fuente

3 respuestas

1

La línea de máquina AS / 400 tiene una larga historia. Normalmente usan la CPU de la familia PowerPC / POWER, pero los primeros modelos comenzaron con una CPU con una velocidad de reloj de 55 MHz, lo que no puede esperar que sea rápido ... Esto podría explicar el rendimiento abismal que obtiene. O quizás hubo algún problema sutil en su proceso de adaptación. Por ejemplo, el desenrollamiento agresivo del bucle puede hacer que un código de función exceda la memoria caché L1, lo que puede matar el rendimiento a lo grande (ya presencié una desaceleración de 50x para tales casos).

De todos modos, las iteraciones en PBKDF2 están diseñadas para compensar la entropía relativamente baja de la contraseña de entrada (porque la contraseña es una contraseña , que se ajusta a un cerebro humano). Si puede hacer que la contraseña tenga una alta entropía, obtendrá seguridad con un recuento de iteraciones bajo.

(Tenga en cuenta que la entropía no es la longitud. La entropía es aleatoriedad .)

    
respondido por el Tom Leek 29.10.2014 - 12:29
fuente
0

Como su nombre lo indica, se utiliza una función de derivación de clave basada en contraseña (PBKDF) para obtener una clave de cifrado a partir de una contraseña . Las contraseñas son generalmente cortas (baja entropía) y el forzado bruto se puede hacer en un tiempo razonable. El PBKDF luego frustrará el uso de fuerza bruta usando mucho tiempo por cada intento.

Parece que tiene el control de la clave (no el usuario está eligiendo una contraseña), en este caso es seguro prescindir del PBKDF y usar la clave secreta directamente. Si su algoritmo por ej. espera una clave de 32 bytes, esta clave tiene una alta entropía y no se puede forzar en forma bruta en un tiempo razonable. Tenga en cuenta que esos 32 bytes no son un texto alfanumérico, sino que es como una matriz de 32 bytes aleatorios.

EDITAR:

Por su comentario, veo que de hecho es una contraseña, por lo que el PBKDF es la forma correcta de hacerlo. En realidad, es correcto que una contraseña larga (una contraseña con una alta entropía) permita disminuir el factor de costo, aunque la dificultad radica en garantizar que el usuario realmente elija una contraseña tan segura. Las reglas habituales no son un buen indicador, porque una contraseña como Password2014 o proverbios conocidos llena la mayoría de las reglas, pero no son contraseñas seguras. Una salida sería que su aplicación genere contraseñas seguras por sí misma y solo acepte contraseñas de este formulario.

    
respondido por el martinstoeckli 28.09.2014 - 15:36
fuente
0
  

Hay algún tipo de regla, como "agregar n caracteres a la contraseña   ¿Es algo equivalente a aumentar el número de iteraciones (c) de x?

La compensación entre la fuerza de la contraseña y el recuento de iteraciones es id: log, donde id es la identidad, y log es el logaritmo. Entonces, 1000 iteraciones significarían alrededor de 10 bits de fuerza de contraseña adicional. Un millón de iteraciones significaría 20 bits adicionales. Sin embargo, no existe una relación fuerte 1: 1 entre el número de caracteres en una contraseña y su fuerza en bits, solo para contraseñas verdaderamente aleatorias.

PBKDF es una solución muy mala para un problema que de otro modo sería aún peor. Solo añade logarítmicamente a la fuerza. Por lo general, PBDKF no genera tanta carga general, ya que incluso para grandes servicios, el número de personas que inician sesión en un momento dado es pequeño en comparación con el número total de usuarios. Pero en su caso, el problema de carga PBDKF se aplica claramente.

    
respondido por el user10008 29.10.2014 - 12:23
fuente

Lea otras preguntas en las etiquetas