Supponiamo di avere un file crittografato AES-256 e voglio ricavare la chiave usando PBKDF2 e un determinato sale con un numero elevato di round (diciamo 1 milione), ma sono limitato dalla tolleranza dell'utente per il ritardo dell'interfaccia utente quando inserendo la loro password. È possibile calcolare una chiave che sia allo stesso modo resistente al cracking calcolando 100 chiavi in parallelo dalla stessa password e 100 diversi sali, per 10000 giri, e poi eseguendoli con una funzione hash come SHA-256?
Il modo standard è fondamentalmente questo:
key = pbkdf2(pseudo_random_function, password, salt, 1000000, 256);
Un modo parallelizzabile potrebbe essere così:
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]));
Supponendo che il metodo di derivazione fosse noto a un cracker, ciò produrrebbe una chiave altrettanto difficile da decifrare come quella standard, e sarebbe altrettanto sicura? In caso contrario, approssimativamente quanto sarebbe sicuro (se è sicuro) in termini di numero equivalente di round usando l'approccio normale?
Forse non è necessario immagazzinare 100 sali, potresti semplicemente immagazzinare 1 sale e poi generare 100 diversi sali usando tecniche di key-stretching / codici a blocchi ecc. Se questo è stato usato in un'applicazione, potresti assumere o far rispettare un capacità minima della GPU prima di consentire all'utente di installarlo.
Il punto di questo sarebbe ridurre la latenza (tempo necessario per ottenere una singola chiave per l'utente), senza aumentare il throughput (numero di chiavi che possono essere derivate in un determinato periodo di tempo con una data quantità di potenza di calcolo da un cracker).