2009-02-07 21 views
49

Mi chiedo quale sia il metodo migliore per creare una funzione di password dimenticata su un sito web. Ho visto un bel po 'là fuori, qui sono alcuni o una combinazione di:Password dimenticata: qual è il metodo migliore per implementare una funzione di password dimenticata?

  • passphrase domanda/risposta (1 o più)
  • inviare e-mail con la nuova password
  • sullo schermo dare nuova password
  • conferma tramite e-mail: deve cliccare sul link per ottenere una nuova password pagina
  • richiedendo all'utente di inserire una nuova password

Quale combinazione o aggiunta tutti i passaggi aggiungerei ad una funzione di password dimenticata? Mi chiedo come chiedano la nuova password e come finiscono per ottenerla.

Sono operativo sul principal che non è possibile recuperare la password; una nuova password deve essere data/generata.

Modifica Mi piace ciò che Cory ha detto di non visualizzare se il nome utente esiste, ma mi chiedo invece cosa visualizzare. Sto pensando che la metà del problema è che l'utente ha dimenticato quale indirizzo email ha usato, il che mostra una sorta di messaggio "non esiste" è utile. Qualche soluzione?

risposta

45
  1. Personalmente invierei un'email con un collegamento a una pagina a breve termine che consente loro di impostare una nuova password. Rendi il nome della pagina una sorta di UID.
  2. Se ciò non ti interessa, invierà loro una nuova password e forzandoli a cambiarlo al primo accesso farebbe altrettanto.

L'opzione 1 è molto più semplice.

+13

L'opzione 1 ha anche il vantaggio di non essere suscettibile agli attacchi DoS sull'utente. Ad esempio, qualcuno fa costantemente clic sul link "Reimposta password" nell'opzione 2, in modo che l'utente sia effettivamente escluso dal proprio account. Puoi proteggerti, ma perché preoccuparsi? L'opzione 1 è la strada da percorrere ... –

+0

+1 per la rara istanza di suono, semplice consiglio di sicurezza. Buon lavoro. –

+0

Qualche motivo per cui l'utente non dovrebbe effettuare il login dopo aver impostato una nuova password? – Tommy

8

Invia email con nuova password.

FORCE una modifica della password all'arrivo e digitare la nuova password.

Ciò garantisce che la persona che desiderava la password fosse l'unica a entrare nell'account.

Se l'e-mail viene annusata, qualcuno potrebbe accedere all'account (ovviamente), ma la parte reale lo scoprirà immediatamente (poiché la password che hai appena inviato non funziona).

Invia anche le conferme delle modifiche della password agli utenti.

Se qualcuno ottiene la nuova password e poi una email che dice "grazie per cambiare la password", sarà piuttosto perplessa e parlerà con un amministratore se non lo ha fatto.

+0

IMO cattiva idea. Lo sniffer potrebbe fare molti danni prima che la vera festa fosse in grado di contattare l'assistenza clienti. – user1069528

0

L'opzione 1. è non una buona idea, in quanto in genere è facilmente intuibile dagli altri. L'e-mail personale di Sarah Palin (Yahoo credo) è stata violata in questo modo da una terza parte.

Le altre opzioni sono migliori e i post precedenti hanno delineato il dettaglio.

+1

Come si "indovina facilmente" lunghe stringhe generate casualmente? – slikts

+0

Il mio riferimento "Opzione 1" non è più chiaro con altri post: si riferisce alla prima opzione presentata dall'OP. Si riferiva a un suggerimento di usare una "domanda segreta", che se la risposta corretta potesse essere interpretata come "quale scuola superiore hai frequentato?". Ci scusiamo per non essere chiaro. – Jayden

1

L'utilizzo del collegamento di verifica e reimpostazione della password offre maggiore sicurezza. Se ti guardi intorno, questo è il modo in cui la maggior parte dei siti Web lo fa e le persone sono piuttosto abituate a questa verifica, quindi ti consiglio di utilizzare questo tipo di autenticazione.

24

alcuni importanti problemi di sicurezza:

  • Una passphrase domanda/risposta riduce effettivamente la sicurezza dal momento che diventa in genere l'anello più debole nel processo. Spesso è più facile indovinare la risposta di qualcuno piuttosto che una password, soprattutto se le domande non vengono scelte con attenzione.
  • Supponendo che le e-mail funzionino come nome utente nel sistema (generalmente consigliato per una serie di motivi), la risposta a una richiesta di reimpostazione della password non dovrebbe indicare se è stato trovato un account valido. Dovrebbe semplicemente dichiarare che una e-mail di richiesta password è stata inviata all'indirizzo fornito. Perché? Una risposta che indica che un messaggio di posta elettronica non esiste/non consente a un hacker di raccogliere un elenco di account utente inviando più richieste di password (in genere tramite un proxy HTTP come la suite di burp) e notando se l'email è stata trovata. Per proteggerti dalla raccolta degli accessi, devi assicurarti che nessuna funzione di login/autenticazione fornisca alcuna indicazione di quando è stata inserita una email di un utente valido su un modulo di login/password.

Per ulteriori informazioni, consultare lo Web Application Hackers Handbook. È un'ottima lettura sulla creazione di modelli di autenticazione sicuri.

EDIT:. Per quanto riguarda la domanda nella tua modifica - suggerirei:

"Una richiesta password di posta elettronica è stato inviata all'indirizzo che hai fornito Se una e-mail non arriva a breve , per favore controlla la tua cartella spam Se non arriva nessuna email , allora non esiste alcun account con l'e-mail che hai fornito. "

C'è un compromesso tra semplicità d'uso e sicurezza. Devi bilanciare questo in base al contesto: la sicurezza è abbastanza importante per te e per i tuoi utenti per giustificare questo inconveniente?

+4

non sareste in grado di determinare se già al momento della registrazione era già in uso una e-mail? – corymathews

+1

Sì, sebbene lo stesso approccio possa essere utilizzato per informare gli utenti esistenti. Si applicano gli stessi avvertimenti con l'impatto sulla facilità d'uso. –

1

Penso che l'opzione 2 (gbrandt) sarebbe un ottimo metodo se combinata con alcune informazioni personali che già avete per l'utente. la data di nascita.

Quando l'utente richiede una nuova password (ripristino) inserendo il suo indirizzo e-mail, deve anche inserire una data di nascita corretta (o qualcos'altro) prima che la password venga resettata e una nuova sia inviata via email all'utente.

Solo chi lo conosce bene può eventualmente infastidirlo reimpostando la sua password! Non può essere un estraneo o un bot

Su 5 o 7 indirizzo email errato & di combinazioni di nascita l'utente viene inviato per e-mail che la sua password è stata richiesta per essere ripristinata e non è riuscita a causa di una credenziale errata. Quindi il ripristino della password per quell'account è sospeso per 24 ore o qualsiasi periodo desiderato.

(se troppi utenti di rivolgersi al webadmin riguardo a questa e-mail che sarà lui a sapere che qualcuno sta cercando di raggiungere maliziosamente informazioni dal tuo sito/app)

Cosa ne pensate voi ragazzi?

-1

L'idea a cui stavo pensando era di firmare i dati nel collegamento che viene inviato all'utente.Quindi, quando l'utente fa clic sul collegamento e il server riceve la chiamata, il server riceve anche la parte crittografata e può verificare che i dati non siano stati toccati.

Ho implementato un progetto JAVA per questo caso d'uso. È su GitHub, open source. Risponde perfettamente alla tua domanda ... implementata in Java.

Come per il collegamento nell'e-mail - genera il collegamento e lo convalida dopo l'utilizzo.

Non ci sono spiegazioni per ogni cosa (e se manca qualcosa - fatemi sapere ...)

dare un'occhiata: https://github.com/OhadR/Authentication-Flows

Consulta l'Demo here.

Questa è l'applicazione web client che utilizza i flussi auth, con il README con tutte le spiegazioni. ti dirige l'implementazione: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows

+0

Ho dato una rapida occhiata alla fonte ma non sono riuscito a ottenere il codice che funziona davvero. Quindi mi sono interrogato sullo sha-256 nella config, questo significa che le password sono hash con un singolo calcolo hash o questa parte di un PBKDF2 iterato? Il sale è davvero derivato dal nome utente, anziché dalla fonte casuale del sistema operativo? Come viene memorizzato il codice della password dimenticata, è memorizzato solo come hash? – martinstoeckli

+0

le password vengono crittografate utilizzando un keystore + salt (il nome utente). se l'utente ha dimenticato la sua password, non la ottiene, ma invece riceve un'e-mail nella sua casella di posta, quindi ci assicuriamo che sia l'UNICO (la sua identità). nell'email c'è un link criptato che lo porta alla pagina "imposta nuova password". puoi provarlo nella demo (il link alla demo è sopra) – OhadR

+0

Il flusso di lavoro mi sembra buono, quello che mi chiedevo è come viene calcolato l'hash o non usi un hash per memorizzare le password in questo keystore? Dovrebbe essere un algoritmo hash lento adattabile come BCrypt o PBKDF2 per essere sicuro. Quindi il sale dovrebbe idealmente essere davvero casuale, non ricavato da altri parametri. Quando ho inviato il modulo password dimenticata, il framework ha inviato un messaggio di posta elettronica con un token che è buono, questo token non deve essere memorizzato nel database, ma solo il suo hash deve essere memorizzato. – martinstoeckli