In generale, no, non è possibile utilizzare uno schema di questo tipo con uno storage basato su hashing e aspettarsi lo stesso tipo di sicurezza con l'hashing con password completa, come è normalmente praticato.
Ecco la dimostrazione: il punto in cui si memorizza la password hash , e non la password in chiaro, è che si presume che gli autori di attacchi possano ottenere una visione (possibilmente di sola lettura) dei contenuti del server (ad esempio con un nastro di backup rubato). Con quella copia, l'attaccante può emulare il comportamento del server sulle proprie macchine.
In particolare, l'attaccante può:
- Avvia la sua emulazione del server.
- Inizia una procedura di autenticazione con quel server emulato. Il server richiede, ad esempio, le lettere 1a, 5a e 8a della password dell'utente.
- L'autore dell'attacco snapshot sul tutto lo stato del server emulato in quel punto.
- Per ogni combinazione possibile di tre lettere, l'attaccante riavvia il server emulato nel punto di snapshot, inserisci le tre lettere e verifica se il server emulato è felice o meno.
- Una volta che l'attaccante ha trovato la giusta combinazione di tre lettere (ci sono solo 26 × 26 × 26 = 17576 combinazioni di tre lettere, che sono davvero poche per un attaccante automatico che può fare le cose a milioni - ricorda che tutto di ciò accade sul server emulato , sulle macchine dello stesso autore dell'attacco), può ricominciare dal punto 1 per indovinare altre lettere. Dopo alcune iterazioni, l'utente malintenzionato ha la password dell'utente completa e può accedere con sicurezza al server reale .
In pratica, l'utente malintenzionato non ha davvero bisogno di creare una macchina virtuale completa con istantanee; può concentrarsi solo sui pochi kilobyte di codice che gestiscono il processo di autenticazione. Ma basare la descrizione su istantanee e emulazione server mostra che questo tipo di attacco è generico e non c'è nulla che possa essere fatto per proteggerlo fino a quando il modello di attacco è valido.
Per ottenere nuovamente la sicurezza, quindi, il modello deve essere fatto per non applicare. Nella discussione sopra, suppongo che l'autore dell'attacco possa ottenere una copia dello stato del server. Quindi, per prevenire quell'attacco, dobbiamo fare in modo che ci sia almeno una parte dello stato del server che l'attaccante non può saccheggiare. In tal caso, è sufficiente memorizzare una chiave simmetrica K in quella parte priva di attacchi del server e utilizzare la crittografia simmetrica per memorizzare le password.
Mi aspetto che la maggior parte dei siti che richiedono combinazioni di lettere all'interno della password dell'utente utilizzino tale crittografia reversibile. Questo può essere considerato "sicuro" se la chiave K è effettivamente tenuta fuori dalla portata degli attaccanti, il che è difficile a meno che tu fallo seriamente (e in modo esaustivo).
Ancora in tutta la generalità, chiedere tre lettere significa concedere l'accesso agli attaccanti casuali con probabilità 1/17576, che è, a mio parere, un po 'troppo alto per il comfort, considerando che stiamo parlando di un server raggiungibile pubblicamente . L'intero concetto di chiedere solo alcune lettere è pensato per essere "più sicuro", ma in realtà si tratta di spargere alcuni elementi rituali odiosi in modo che tu possa sentirti più sicuro, possibilmente a spese dell'attuale la sicurezza.