Il modo migliore per un'implementazione "password dimenticata"? [chiuso]


154

Sto cercando il metodo migliore per implementare una funzione "password dimenticata".

Esco con 2 idee:

  1. Quando l'utente fa clic su password dimenticata, l'utente deve digitare il nome utente, l'e-mail e forse la data di nascita o il cognome. Quindi una mail con password temporanea verrà inviata all'account e-mail dell'utente. L'utente utilizza la password temporanea per accedere e reimposta la password.

  2. Simile, ma l'e-mail conterrebbe un collegamento per consentire all'utente di reimpostare la password.

O qualcuno può suggerirmi un modo migliore e sicuro? Sto anche pensando di inviare la password o il link temporaneo, forzare l'utente a reimpostare la password entro 24 ore, altrimenti la password o il link temporaneo non saranno utilizzabili. Come farlo?


Ho ricodificato il post dal momento che questo va oltre JSF - probabilmente otterrai più risposte in questo modo.
McDowell,

6
@Weverever C'è un'ondata di "eliminiamo questa domanda chiusa perché XYZ" su meta in questi mesi. Vorrei solo sottolineare che questa particolare domanda non dovrebbe essere eliminata, a meno che non sia dimostrato che le soluzioni sono imperfette e che la sua esistenza fa letteralmente male più di quanto non aiuti il ​​caso della sicurezza.
Félix Gagnon-Grenier,

1
"Cheat sheet" OWASP per una strategia di recupero password dimenticata: owasp.org/index.php/…
daiscog,

Il link suggerito da @megaflop è ora tristemente rotto, ecco il nuovo link: cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

Risposte:


187

Aggiornamento: rivisto a maggio 2013 per un approccio migliore

  1. L'utente inserisce il suo nome utente e preme "password dimenticata". Consiglio anche l'opzione di inserire l'indirizzo e-mail anziché il nome utente, perché a volte anche i nomi utente vengono dimenticati.
  2. Il sistema ha una tabella password_change_requestscon le colonne ID, Timee UserID. Quando il nuovo utente preme il pulsante, viene creato un record nella tabella. La Timecolonna contiene l'ora in cui l'utente ha premuto il pulsante "Password dimenticata". Il IDè una stringa. Viene creata una lunga stringa casuale (ad esempio un GUID) e quindi l' hash come una password (che è un argomento separato in sé e per sé). Questo hash viene quindi utilizzato come "ID" nella tabella.
  3. Il sistema invia un'e-mail all'utente che contiene un collegamento al suo interno. Il collegamento contiene anche la stringa ID originale (prima dell'hash). Il collegamento sarà qualcosa di simile a questo: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. La pagina forgotpassword.jsp dovrebbe essere in grado di recuperare il parametro ID. Spiacente, non conosco Java, quindi non posso essere più specifico.
  4. Quando l'utente fa clic sul collegamento nell'e-mail, viene spostato sulla tua pagina. La pagina recupera l' IDURL, lo esegue nuovamente l'hashing e verifica la tabella. Se tale record è presente e non supera, ad esempio, 24 ore prima, all'utente viene richiesto di inserire una nuova password .
  5. L'utente inserisce una nuova password, preme OK e tutti vivono felici e contenti ... fino alla prossima volta!

1
il modo più appropriato per implementarlo sarebbe: inviare all'utente il token temporaneo di reimpostazione della password come e-mail in testo normale (ma non memorizzarlo mai come testo normale nel DB) - dopo che l'utente immette questa temperatura lo costringe immediatamente a reinserisci una nuova password. - per il paranoico, assicurati che il tuo server smtp abbia SSL, in modo che le tue e-mail contenenti informazioni sensibili non vengano ficcate. nella maggior parte dei casi, questo approccio è piuttosto sicuro. se il tuo caso richiede ulteriore sicurezza, probabilmente non dovresti avere utenti che dimenticano le loro password: S
Kaushik Gopal

6
Perché generare una stringa / guida casuale, l'hash e usare l'hash? Il guid non è sufficiente?
Jeroen K,

15
@jeroenk - In modo che se qualcuno ruba il tuo DB, non può creare un link "Reimposta password" e modificare la password di qualcuno.
Vilx-

4
questo è essenzialmente il modo descritto di reimpostare correttamente una password crackstation.net/hashing-security.htm#faq
TruthOf42

1
@ David - Ach, volevo modificare il post, ma l'argomento è bloccato. :( OK, proviamo di nuovo: la vostra tavola conterrà le colonne: ID, UserID, Time, TokenHash.. Si genererà due lunghe stringhe casuali Mettere la prima stringa ( "id") nella IDcolonna; hash il secondo (il "token" ) e inserisci l'hash nella TokenHashcolonna. Genera il link like forogotPassword.jsp?id=asdasd&token=asdasd. Il token nel link NON è hash.
Ha

28

Tutto dipende dal tuo sito e dal livello di sicurezza che stai cercando di raggiungere, ma il processo di base per un'app Web procede in questo modo:

  1. L'utente accede alla pagina "password dimenticata" e immette il nome utente o l'indirizzo e-mail (qualunque sia unico) per richiedere un ripristino della password.

  2. Opzionalmente in questa fase è possibile confermare la richiesta chiedendo informazioni aggiuntive come la risposta a una domanda di sicurezza predefinita o la loro data di nascita ecc. Questo livello aggiuntivo impedisce agli utenti di ricevere e-mail che non hanno richiesto.

  3. Cerca l'account dell'utente. Salvare una password temporanea (di solito un GUID) e il timestamp sul record dell'account. Invia una e-mail all'utente contenente la password temporanea.

  4. L'utente fa clic sul collegamento contenente la password temporanea e l'identificatore dell'utente nell'e-mail o accede alla pagina "password dimenticata" e copia e incolla la password temporanea e il loro identificatore. L'utente inserisce la nuova password e la conferma.

  5. Cerca il record dell'utente e se l'ora corrente è entro un limite di tempo specificato (ad es. 1 ora) del timestamp salvato nel passaggio 2, quindi hash e salva la nuova password. (Ovviamente solo se le password temporanee corrispondono!). Elimina il GUID temporaneo e il timestamp.

Il principale qui è che all'utente viene inviata una password temporanea via e-mail che consente di cambiare la propria password. La password memorizzata originariamente (dovrebbe essere hash!) Non viene mai cambiata in una password temporanea nel caso in cui l'utente la ricordi.

La password originale non verrà mai mostrata all'utente in quanto dovrebbe essere hash e sconosciuta.

Nota che questo processo si basa interamente sulla sicurezza dell'account e-mail dell'utente. Quindi dipende dal livello di sicurezza che desideri raggiungere. Questo di solito è sufficiente per la maggior parte dei siti / app.


24

Troy Hunt evidenzia alcuni punti eccellenti nel suo articolo, Tutto quello che avresti sempre voluto sapere sulla creazione di una funzione di reimpostazione sicura della password . Gli estratti più rilevanti sono:

[T] qui ci sono due approcci comuni:

  1. Genera una nuova password sul server e inviala tramite e-mail
  2. Invia un URL univoco che faciliterà un processo di reimpostazione

Nonostante molte indicazioni contrarie, il primo punto non è proprio dove vogliamo essere. Il problema nel fare questo è che significa che una password persistente - una con cui puoi tornare indietro e usare in qualsiasi momento - è stata inviata su un canale non sicuro e risiede nella tua casella di posta.

...

Ma c'è un altro grosso problema con il primo approccio in quanto rende semplice il blocco dannoso di un account. Se conosco l'indirizzo e-mail di qualcuno che possiede un account su un sito Web, posso bloccarlo ogni volta che per favore semplicemente reimpostando la password; è un attacco denial of service servito su un piatto d'argento! Questo è il motivo per cui un ripristino è qualcosa che dovrebbe avvenire solo dopo aver verificato con successo il diritto del richiedente di farlo.

Quando parliamo di un URL di ripristino, stiamo parlando di un indirizzo del sito Web che è unico per questa specifica istanza del processo di ripristino.

...

Quello che vogliamo fare è creare un token univoco che può essere inviato in un'e-mail come parte dell'URL di reimpostazione, quindi abbinato a un record sul server accanto all'account dell'utente, confermando che il proprietario dell'account e-mail è effettivamente quello che tenta di ripristinare parola d'ordine. Ad esempio, il token può essere "3ce7854015cd38c862cb9e14a1ae552b" ed è memorizzato in una tabella accanto all'ID dell'utente che esegue il ripristino e al momento in cui il token è stato generato (ne parleremo più in un momento). Quando l'e-mail viene inviata, contiene un URL come "Reimposta /? Id = 3ce7854015cd38c862cb9e14a1ae552b" e quando l'utente carica questo, la pagina verifica l'esistenza del token e quindi conferma l'identità dell'utente e consente alla password di essere cambiato.

...

L'altra cosa che vogliamo fare con un URL di reimpostazione è limitare il token in modo che il processo di reimpostazione debba essere completato entro una certa durata, ad esempio entro un'ora.

...

Infine, vogliamo garantire che si tratti di un processo una tantum. Una volta completato il processo di ripristino, il token deve essere eliminato in modo che l'URL di ripristino non sia più funzionale. Come nel punto precedente, ciò per garantire che un utente malintenzionato abbia una finestra molto limitata in cui può abusare dell'URL di reimpostazione. Inoltre, ovviamente, il token non è più necessario se il processo di ripristino è stato completato correttamente.

Fa molti altri aspetti positivi nell'evitare perdite di informazioni, CAPTCHA, autenticazione a due fattori e, naturalmente, le migliori pratiche di base come l'hash della password. Penso che sia importante notare che non sono d'accordo con Troia sull'utilità delle domande di sicurezza, preferendo lo scetticismo di Bruce Schneier sulla pratica :

Il punto di tutte queste domande è lo stesso: una password di backup. Se si dimentica la password, la domanda segreta può verificare la propria identità in modo da poter scegliere un'altra password o avere il sito e-mail la password corrente a voi. È un'ottima idea dal punto di vista del servizio clienti - è meno probabile che un utente dimentichi il nome del suo primo animale domestico rispetto a una password casuale - ma è terribile per la sicurezza. La risposta alla domanda segreta è molto più facile da indovinare di una buona password e le informazioni sono molto più pubbliche.


1
Quel link ha chiare immagini NSFW, c'è un link per cambiare questo, ma molte persone scansionano prima una pagina. Stupida idea!
nik0lai,

Il link all'articolo di Troy Hunt è cambiato. Vai a troyhunt.com/everything-you-ever-wanted-to-know
knarfancho

@knarfancho Risolto, grazie!
Dave Liepmann,

15

Vado con:

  1. Chiedi all'utente e-mail, controlla che l'e-mail sia registrata
  2. Genera GUID e invialo a quell'email
  3. Non reimpostare la password ancora
  4. Il link degli utenti fa clic e quindi deve inserire un nuovo pass
  5. Reimposta la password solo dopo che l'utente è nel tuo sito e dopo aver digitato il nuovo passaggio hai fatto clic sul pulsante Reimposta.
  6. Rendi il GUID espandibile in breve tempo per renderlo più sicuro.

Non voglio avere problemi a chiedere un? ma è legato alla tua risposta. Come stai generando il GUID?
KingAndrew

2
-1 per non aver implementato un qualche tipo di hash sul link che stai inviando alla persona
TruthOf42

11

Quando si inviano informazioni via e-mail, non saranno sicure. Ci sono troppi modi in cui qualcuno può ottenerlo. Sarebbe un gioco da ragazzi per un hacker esperto che cerca di rubare le tue informazioni.

Astenersi dall'invio di informazioni personali come password e informazioni sul reddito via e-mail in quanto può diventare MOLTO IMBARCANTE per te e la tua organizzazione se tali informazioni fossero trapelate o rubate. Pensa seriamente alla sicurezza. Basta un solo incidente per far cadere tutti i mattoni.

Per quanto riguarda il recupero della password, leggi attentamente le migliori pratiche per la password dimenticata .

La linea di fondo è che un'applicazione che segue le migliori pratiche dovrebbe consentire a un utente di reimpostare la propria password. Dovrebbero essere utilizzate domande sulla sicurezza personale. L'applicazione non deve inviare e-mail, visualizzare password o impostare password temporanee.

EDIT: collegamento aggiornato



Ho provato il collegamento per le procedure consigliate per la password dimenticata e ho riscontrato un errore del server 500. Pensi che il server sia spento proprio ora o c'è un altro link da seguire?
KingAndrew


il collegamento è di nuovo morto.
Eric Cope,


7

Come detto, dipende dal livello di sicurezza richiesto, tuttavia, se hai bisogno di un livello superiore, alcune nuove soluzioni che ho visto includono;

  • Visualizzazione della metà della password temporanea quando l'identità dell'utente è stata confermata (domanda di sicurezza, indirizzo e-mail, ecc.), Quindi l'altra metà viene inviata all'account e-mail. Se l'account e-mail è stato compromesso, è improbabile che anche la stessa persona sia riuscita a eseguire un attacco man-in-the-middle. (Visto su UK Goverment Gateway)

  • Conferma dell'identità tramite e-mail e un altro supporto, ad esempio un codice inviato via SMS a un cellulare registrato. (Visto su eBay / PayPal)

Da qualche parte tra questi due estremi l'implementazione di domande di sicurezza può essere la strada da percorrere, come indicato da DaveG.


6

Se si include un indirizzo e-mail con la registrazione. Il pulsante "dimentica password" invia un'email a quell'indirizzo email. Assicura che le informazioni vengano inviate a un'e-mail attendibile.

(A meno che il database non sia stato violato, ma nulla è sicuro).



4

Imporrei indirizzi e-mail univoci in tutti gli account.

Quindi si tratta semplicemente di inviare un collegamento a una pagina temporanea che consente alla persona di modificare la propria password. (consentire 24 ore o meno)

L'account e-mail dell'utente è il collegamento più debole in questo scenario.


2

Non inviare mai una password all'utente. Anche se viene generato automaticamente. Il miglior approccio (consigliato e utilizzato da SANS e altri):

  1. Nella pagina della password dimenticata, chiedi all'utente l'e-mail / ID utente e una NUOVA password.
  2. Invia un link all'email memorizzata per quell'account con un link di attivazione.
  3. Quando l'utente fa clic su quel collegamento, abilita la nuova password.

Se non fa clic sul collegamento entro 24 ore circa, disabilita il collegamento (in modo che non cambi più la password).

Non modificare mai la password senza il consenso dell'utente. Significa non inviare una nuova password via e-mail solo perché qualcuno ha fatto clic sul collegamento della password dimenticata e ha capito il nome dell'account.


13
Sono interessato a questa tecnica. L'attaccante inserisce la tua e-mail e una NUOVA password. Il proprietario dell'account riceve l'e-mail, legge male qualcosa e fa clic sul collegamento. L'attaccante in attesa, provando una nuova password ogni minuto, ottiene l'accesso all'account fino a quando il proprietario dell'account non capisce cosa è successo e alla fine passa alla pagina "password dimenticata".
Odi - Xceed,

Un altro problema! fornire una nuova password al tempo di reimpostazione della password non è una buona opzione. Potrei dimenticare di nuovo la nuova password se ho controllato la mia e-mail dopo ore!
Yazid Erman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.