Un po 'di sfondo prima:
Il motivo per cui le password non vengono memorizzate come testo normale è solitamente quello di fornire una difesa approfondita. Cioè, nel caso di un compromesso del database (che è qualcosa che dovrebbe essere ovviamente prevenuto), dovrebbe impedire all'utente malintenzionato di accedere alle password degli utenti originali. Questo di solito rende l'accesso alle password protette da PBKDF2 meno prezioso per l'aggressore. Naturalmente, ciò vale solo quando le password sono forti.
Per rispondere alla tua domanda:
Se i PBKDF2 sono stati calcolati sul lato client, una volta che l'attaccante ha avuto accesso al database, l'utente malintenzionato può utilizzare l'output PBKDF2 (memorizzato nel database) per accedere come utenti vittima attraverso l'interfaccia web. Cioè, l'attaccante non ha bisogno di accedere alla password originale per accedere. L'utente malintenzionato può semplicemente inviare il nome utente e il valore PBKDF2 della password sconosciuta al server e accedere come se fosse un utente legittimo. L'unica differenza è che l'utente legittimo fa uso di JavaScript o di un altro meccanismo sul lato client per calcolare il valore PBKDF2 mentre l'utente malintenzionato dovrebbe averlo nel database.
Di conseguenza, la premessa iniziale di rendere meno prezioso l'accesso alle password con hash non è più valida in quanto l'accesso a tali informazioni ha valore (dà accesso all'attaccante all'account degli utenti vittima). Ha meno valore per l'utente malintenzionato rispetto all'accesso alla password originale (prima di eseguire l'operazione PBKDF2) ma ha più valore che se fosse crittografato sul lato server.
Ci sono altri problemi con il PBKDF2 lato client che penso dovrebbe essere menzionato:
- si dovrebbe usare un sale statico (cioè non può essere casuale in quanto produrrebbe un valore PBKDF2 diverso)
- altri valori passati alla funzione lato client PBKDF2 dovrebbero anche essere statici, rimuovendo così un certo numero di funzionalità di sicurezza (come la modifica del numero di iterazioni)
- proprio come nel caso del PBKDF2 lato server, la password originale può essere recuperata iniettando codice JavaScript per leggere i tasti o valori di input nel caso di un compromesso dell'applicazione Web (ad esempio XSS e vari altri vettori); in modo che i potenziali guadagni di sicurezza del PBKDF2 lato client siano persi