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?