Come evitare le corrispondenze di username e password quando si modifica un nome utente?

34

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?

    
posta PwdRsch 07.03.2016 - 20:36
fonte

8 risposte

108

L'unico modo sensato per ottenere quello che vuoi è chiedere la password quando un utente cambia il suo nome utente. In questo modo il server ha sempre le informazioni necessarie per condurre un confronto accurato tra il nome utente e la password durante una modifica ed evitare corrispondenze.

Poiché le operazioni sensibili, come la modifica delle password o i nomi utente dei tuoi casi, dovrebbero richiedere comunque una password (per limitare il danno di XSS), questo non dovrebbe essere un problema.

L'unica altra alternativa è provare ogni possibile combinazione di casi, cancellarla e confrontarla con l'hash memorizzato quando un utente cambia il nome utente.

    
risposta data 07.03.2016 - 20:45
fonte
13

Andando un po 'controvoglia - non importa se il nome utente è cambiato in una stringa "sostanzialmente simile" come password. Avvisa gli utenti del pericolo di selezionare la stessa password e controlla la corrispondenza identica .

Indipendentemente dal numero di regole che imposti, se l'utente è determinato troverà un modo per aggirarle. Se è necessario, richiedere la password al cambio del nome utente in modo da poterli forzare allo stesso contenitore, o semplicemente lasciarlo passare e controllare la prossima volta che effettuano l'accesso e forzare un cambio utente / passaggio.

Il tempo solo di ciò è importante se i tuoi utenti sono sottoposti a un attacco mirato. Se un kiddie di script casuali (o qualche altro opportunista) viene inserito nell'elenco degli utenti, hanno strumenti molto più sofisticati per infrangere quelle password piuttosto che cercare di abbinare il nome utente. Lo stesso vale per l'aggressore designato, ma possono iniziare con cose semplici che possono digitare sulla tastiera. E se si tratta di una persona intelligente che cerca di infrangere la password "PwdRsch1", sarai davvero sicuro solo controllando le differenze tra maiuscole e minuscole? Che ne pensi di "pwdr5ch1"? "PwdRsch2"? "1hcsRdwP"? Puoi scrivere le regole per uno di questi scenari a cui puoi pensare, ma o ce ne sarà uno che hai dimenticato o renderà così difficile selezionare una combinazione di nome utente / password che si concluderà con "P4ssw0rd!" e fatelo.

L'istruzione è il modo solo per consentire agli utenti di utilizzare password realmente sicure e ci saranno sempre quelle che non rispettano.

    
risposta data 08.03.2016 - 15:06
fonte
8

Diciamo che il nome utente contiene 10 lettere. Ecco 1024 combinazioni diverse di maiuscole e minuscole. Controllali tutti.

Non memorizzare l'hash della password in minuscolo. Quel 1024 può sembrare inopportuno, ma è la differenza tra un giorno e tre anni per un aggressore.

    
risposta data 08.03.2016 - 05:09
fonte
4

Dovresti forzare gli userid e le password a provenire da diversi set. Nei commenti sembra che l'ID utente debba seguire dal nome legale dell'utente in modo formulaico "John Smith" - > "jsmith" e "Jane Doe" - > "Jdoe". Quindi se Jane sposa John e prende il suo nome, il suo id utente deve cambiare in qualcosa come "jsmith2"

Quindi puoi stabilire che il primo carattere di una password deve essere un simbolo o che la password deve contenere un simbolo.

Se gli userid sono troncati a 8 caratteri, potresti richiedere che le password contengano almeno 9 caratteri.

Potresti prendere il prodotto cartesiano di un elenco di cognomi e un elenco di nomi specifici e utilizzarlo come lista nera per le password. Se un dipendente ha un nome che non era nel tuo elenco, aggiungilo e, poiché le persone cambiano password, il problema si risolverà da solo.

    
risposta data 07.03.2016 - 21:50
fonte
2

Questa non è una risposta, la sto solo citando in modo che le persone non lo facciano .

Potresti decidere che avrebbe senso memorizzare, oltre al normale hash della loro password sensibile al maiuscolo / minuscolo, un hash della loro password convertita in caratteri minuscoli.

Questo risolverà sicuramente il tuo problema: devi solo mettere in minuscolo il nome utente a cui stai cambiando e confrontarlo con questo hash memorizzato della password in minuscolo.

Lo svantaggio evidente è che ciò in parte vanifica lo scopo di una password hash in primo luogo: rendere gli attacchi alla tua lista delle password molto più difficile. Un utente malintenzionato che accede ai tuoi elenchi di password con hash sarebbe in grado di attaccare l'hash minuscolo più debole (2 ^ n volte più debole) anziché l'hash sensibile al maiuscolo / minuscolo.

Quindi le altre opzioni menzionate (chiedendo la password al momento della modifica, provando tutte le permutazioni del caso se un amministratore la modifica, idealmente in ordine più probabile prima) sembrano scommesse molto migliori.

    
risposta data 08.03.2016 - 19:25
fonte
2

Alcune grandi risposte già, ma qui è un modo alternativo per affrontare questo problema. Invece di provare a confrontare il nuovo nome utente con la password esistente, potresti semplicemente forzare una modifica della password ogni volta che un utente cambia il nome utente.

Ovviamente, vorrai avvisare gli utenti che la modifica del nome utente richiederà la modifica della password, ma puoi facilmente utilizzare qualsiasi processo già esistente per verificare le nuove password rispetto ai nomi utente.

    
risposta data 08.03.2016 - 23:35
fonte
0

Mentre la soluzione più sensata è stata già menzionata e accettata, ovvero chiedere la modifica della password per l'utente perché dovresti farlo comunque. Un'alternativa è anche quella di memorizzare l'hash della password in minuscolo (con un diverso salt?) E confrontare il nome utente in minuscolo con quello.

    
risposta data 09.03.2016 - 19:22
fonte
0

L'unico modo per impedire agli utenti di selezionare password stupide è forzare le politiche di generazione delle password (in contrasto con le politiche formattazione ).

Ora, se non hai molta autorità sui tuoi utenti (la maggior parte dei siti web non lo fa), dovresti almeno dir loro di generare le loro password con un gestore di password (e generare la loro password principale con dice ) e potresti essere in grado di rendere difficile disobbedire a questa norma:

Un modo per farlo è rendere il campo della password non accettato input da tastiera, ma solo dati incollati o dati digitati a macchina (ti consiglio di controllare la velocità con cui i caratteri sono inseriti). Quindi puoi avere la casella che spiega la politica della password da delineare in rosso o qualcosa per richiamare l'attenzione su di essa.

    
risposta data 23.10.2017 - 21:56
fonte

Leggi altre domande sui tag