Immagina che l'utente abbia una password "stack overflow" inserita durante la registrazione sul sito web. Il sito web dividerà la password in due, la prima parte avrà sempre una lunghezza di quattro caratteri:
Part 1: "stac"
Part 2: "k overflow"
Quindi alcuni caratteri casuali vengono aggiunti alla prima parte e anteposti alla seconda parte, dato che la parte preposta è di una certa lunghezza, diciamo 6:
Part 1: "stacd9u8BHaI1"
Part 2: "hBy47k overflow"
La prima parte viene salata e hash su un primo server e archiviata nel database. La seconda parte utilizza un diverso salt, un diverso hash e un database su un server diverso.
Immagina che un hacker ottenga l'accesso al primo database e trovi con successo, ad esempio attraverso la forza bruta, la password "stacd9u8BHaI1". L'hacker verifica questa password sul sito web e nota che non funziona. Potrebbe essere scoraggiato da ciò e abbandonare il tentativo di trovare altre password. È una sicurezza supplementare, dal momento che non è estremamente strong, ma è comunque valida se non costa troppo in termini di risorse rispetto all'autentica autenticazione a server singolo.
Non è facile scoprire quale parte della password è archiviata?
In realtà no. È possibile, ma non facile. Se trovi, tramite la forza bruta, che la password originale è "hBy47k overflow", puoi indovinare che l'inizio è stato randomizzato, ma non è semplice. I caratteri casuali possono anche essere regolati di conseguenza: ad esempio per le password che contengono solo parole, una parola può essere aggiunta / aggiunta anziché caratteri casuali:
Part 1: "stac battery" // Appending a random number of characters
Part 2: "change k overflow" // Prepending 7 characters
o
Part 1: "stac white unicorn"
Part 2: "global k overflow" // Still 7 characters
In realtà è necessario forzare le password con più password per indovinare quanti caratteri in sospeso / aggiunti sono presenti.
Quando fallisce?
C'è un caso in cui questa tecnica fallisce miseramente: se hai un account su un sistema compromesso, conosci già la tua password, quindi con la bruteforcing delle due parti, puoi facilmente vedere quali parti sono state conservate. Rendere il numero di caratteri nella prima parte e il numero di caratteri anteposto alla seconda parte dipende da un elemento relativo alla password stessa rende più difficile la comprensione del sistema, ma comunque abbastanza fattibile.
Devo implementare questo sistema adesso?
No. La sicurezza che si basa sul fatto che si mantiene segreto il modo in cui si memorizzano le password è debole. Chiunque abbia accesso al codice sorgente conosce tutti gli elementi.
La tecnica della password divisa ha un piccolo vantaggio, ma non vale la pena di essere implementata in ogni sito web. Basta usare PBKDF2 con i parametri corretti, e starai bene. Anche se sei una banca. Sono abbastanza sicuro che la mia banca memorizzi la mia password in chiaro nel database, così come la maggior parte dei siti web che usi quotidianamente. Questo fa schifo.