Diciamo che ho un sistema in cui uno dei requisiti di sicurezza impedisce agli utenti di scegliere una password che corrisponda al loro nome utente. I nomi utente non sono case sensitive ma le password sono. Le password vengono memorizzate dal server utilizzando una funzione di hashing sicura che non può essere annullata.
Quando viene creato l'account, sia il nome utente sia la password sono inizialmente disponibili in chiaro sul server per il confronto. Possiamo confrontarli in memoria (ignorando il caso) per vedere se corrispondono e istruire l'utente a scegliere una password diversa se lo fa. Una volta che questo controllo è soddisfatto, la password viene cancellata in modo sicuro per la memorizzazione mentre il nome utente è memorizzato in chiaro. Nessun problema per soddisfare il requisito qui.
Quando l'utente vuole modificare la propria password, o viene modificata per loro, il server può recuperare il proprio nome utente e confrontarlo con il valore della nuova password (sempre ignorando il caso) per vedere se corrisponde. Nessun problema per soddisfare il requisito qui.
Tuttavia, il sistema consente anche modifiche al nome utente. Durante questo processo di modifica dell'ID, l'utente non ha necessariamente fornito la propria password in chiaro al server. Potrebbero averlo fatto quando si sono autenticati, ma il server non ha intenzione di mantenere quella password memorizzata in testo semplice nel caso in cui decidano di cambiare il loro nome utente. Quindi la password in chiaro non è disponibile per verificare una corrispondenza con il valore del nome utente appena scelto.
Nel tentativo di soddisfare il nostro requisito, il server può utilizzare la stessa funzione di hash sicuro per cancellare il nuovo nome utente e confrontarlo con la password hash registrata. Se corrispondono, il server può richiedere all'utente di scegliere un nome utente diverso. Tuttavia, poiché il nome utente non è sensibile al maiuscolo / minuscolo, questo controllo potrebbe non riuscire quando è verosimilmente vero. Se invio "PwdRsch1" come nuova scelta di nome utente e la mia password è "pwdrsch1", il sistema lo consentirà poiché gli hash non corrisponderanno. Io - o peggio, un utente malintenzionato - potrei poi autenticarmi con un nome utente e una password di "pwdrsch1".
Potremmo forzare il nome utente in caratteri minuscoli prima dell'ashing e controllarlo con la password, ma lo scenario inverso è possibile. Il nome utente verrebbe controllato come "pwdrsch1" con una password di "PwdRsch1" e consentito poiché questi non corrispondono. Ma in seguito posso autenticare con successo un nome utente e una password corrispondenti a "PwdRsch1".
Quali opzioni ragionevoli devo ridurre questo rischio di una password che corrisponde a un nome utente che non distingue maiuscole e minuscole?