Vecchia domanda, ma poiché la domanda riguarda la sicurezza e non la comodità credo che a tutte queste risposte manchi un aspetto importante: attacchi di enumerazione . Sono d'accordo sul fatto che le password e / o un altro secondo fattore è ciò che viene utilizzato per autenticare gli utenti come utente2428118 menzionato in precedenza e non il nome utente / email, quindi non ho intenzione di discuterne affatto. Inoltre, in caso di violazione del database, né il nome utente né l'e-mail sono più o meno sicuri poiché sono entrambi archiviati in testo normale.
Tuttavia, un aspetto della sicurezza che nessuna di queste domande riguarda è nome utente / email enumerazione. Nella sicurezza delle applicazioni, il nostro obiettivo è ridurre al minimo o eliminare la conoscenza di un hacker che potrebbe aiutarli ad entrare nel sistema. Se riescono a determinare il nome utente o l'indirizzo email utilizzati per un account, tale account è meno sicuro di un account di cui l'hacker non è a conoscenza.
Se usiamo i nomi utente per l'autenticazione, abbiamo bisogno di un modo per dire a un utente che il nome utente desiderato è già acquisito quando si sta registrando. Questo può essere sfruttato da un hacker per determinare se esiste già un determinato nome utente. Questa è una cosa negativa perché se conoscono il nome utente, possono quindi tentare di accedere con le password più comunemente utilizzate da precedenti violazioni del database. Queste password comuni sono prontamente disponibili online.
Tuttavia, se invece utilizziamo indirizzi email per l'autenticazione, quando aggiungi un nuovo account e l'email esiste già, invia semplicemente un'email di recupero password all'utente anziché una nuova email di iscrizione. Tuttavia nell'interfaccia utente, è sufficiente dire all'utente di controllare il proprio indirizzo email per ulteriori istruzioni, ma non indicare se tale indirizzo è valido o meno.
E-mail
- L'hacker può indovinare in base al tuo nome utilizzando [email protected] o altri indirizzi di uso comune (ad es. [email protected], [email protected], ecc.) o compilando il modulo web e utilizzando l'indirizzo nel risposta e-mail per tentare l'autenticazione. Tuttavia, gli utenti sono generalmente liberi di scegliere qualsiasi indirizzo email che desiderano, anche gli indirizzi personali, e gli utenti che accedono potrebbero non essere necessariamente affiliati o impiegati dal sito Web al quale si stanno collegando, quindi in questo caso non avrebbero una @company .com indirizzo e-mail che si collega al sito Web company.com.
- Gli attacchi di enumerazione possono essere prevenuti.
Nome utente
- A volte visualizzato online (ad esempio
"This post was created by {{username}} on {{date}}"
) mentre le e-mail dovrebbero, si spera, non essere mai visualizzate in testo semplice.
- Gli attacchi di enumerazione non possono essere prevenuti
- Più vulnerabile agli attacchi di dizionario poiché le persone spesso scelgono nomi utente semplici (ad es. il loro nome).
Bonus: Detto questo, un altro (più difficile) modo in cui un hacker può determinare se un nome utente o un messaggio di posta elettronica esiste nel sistema sta tentando di accedere e guardare i tempi di risposta della pagina. Le migliori linee guida di sicurezza mostrano che vogliamo che le nostre password vengano sottoposte a hash con un hash lento, tuttavia se nel database non esiste un nome utente o un'e-mail, non dovremo verificare l'hash della password perché non ci sono utenti corrispondenti. Se il nostro hash richiede 100 ms per eseguire e la query del database richiede 5 ms, i tempi di risposta per una richiesta per un utente valido saranno, in media, 95 ms più lenti di un utente non valido. Il modo in cui mi aggiro è quello di cancellare sempre la password fornita, anche se l'utente non esiste nel database, o se l'utente esiste, quindi ho solo verificato l'hash nel database.