Supongamos que tengo un archivo cifrado AES-256, y quiero obtener la clave utilizando PBKDF2 y una sal dada con un gran número de rondas (por ejemplo, 1 millón), pero estoy limitado por la tolerancia del usuario al retraso de la IU cuando introduciendo su contraseña. ¿Es posible calcular una clave que es similarmente resistente al crackeo al computar 100 claves en paralelo con la misma contraseña y 100 sales diferentes, para 10000 rondas, y luego combinarlas con una función hash como SHA-256?
La forma estándar es básicamente esta:
key = pbkdf2(pseudo_random_function, password, salt, 1000000, 256);
Una forma paralelizable podría ser así:
for(i = 0; i < 100; i++) // parallelize this on the GPU/FPGA etc
{
partial_keys[i] = pbkdf2(pseudo_random_function, password, salts[i], 10000, 256);
}
key = sha256(concatenate(partial_keys[0] ... partial_keys[99]));
Suponiendo que el método de derivación era conocido por un cracker, ¿produciría una clave que fuera igualmente difícil de descifrar como la forma estándar, y sería tan seguro? Si no, ¿qué tan seguro sería (si es que está seguro) en términos de número equivalente de rondas utilizando el método normal?
Tal vez no sea necesario almacenar 100 sales, solo puede almacenar 1 sal y luego generar 100 sales diferentes con el uso de técnicas de estiramiento de claves / cifrados de bloque, etc. Si se usó en una aplicación, podría asumir o hacer cumplir una capacidad mínima de GPU antes de permitir que el usuario la instale.
El objetivo de esto sería reducir la latencia (el tiempo necesario para obtener una clave única para el usuario), sin aumentar el rendimiento (número de claves que pueden derivarse en un período de tiempo determinado con una cantidad determinada de potencia de cálculo). por una galleta).