Come posso memorizzare una cronologia delle password per impedirne il riutilizzo?

11

Ho un'applicazione con un database utente. Il database memorizza la password utilizzando un hash bcrypt con un sale randomizzato.

Come posso implementare un set di cronologia delle password (per impedire il riutilizzo della password) in un caso come questo?

Se ho il classico reset di password a 3 campi (inserisci corrente, inserisci nuovo, conferma nuovo), potrei memorizzare quello corrente mentre sostituisco il vecchio con il nuovo. Tuttavia, allora ho il caso di una password dimenticata. I miei utenti potrebbero fare un reset automatico self-service e riutilizzare le loro password più e più volte.

Le password memorizzate dovrebbero essere crittografate, ma con crittografia reversibile che le rende meno sicure.

    
posta Snowburnt 31.12.2013 - 15:57
fonte

3 risposte

16

Memorizza i vecchi valori di sale e hash. Hash il nuovo input con eventuali vecchi sali e vedere se corrispondono.

Se ha funzionato per verificare la password quando sono entrati normalmente, funzionerà per verificare se la password è stata utilizzata anche in precedenza.

    
risposta data 31.12.2013 - 16:23
fonte
5

Se password1 = password2 , quindi hash(password1, salt1) = hash(password2, salt1) .

In altre parole:

  • Bcrypt la nuova password con lo stesso numero di sale e iterazione.

  • Confronta gli hash.

  • Se il nuovo hash è diverso dal vecchio hash, allora tutto è a posto (secondo i tuoi criteri), e puoi semplicemente re-hash la nuova password con un nuovo salt unico e memorizzarlo nel database.

  • Se il nuovo hash è lo stesso, la nuova password è la stessa della vecchia password. Dì al tuo utente di sceglierne uno nuovo.

risposta data 31.12.2013 - 16:04
fonte
1

My users could go and do an self-service auto reset and reuse their passwords over and over again.

Per risolvere questo problema sollevato nella domanda originale, dovresti memorizzare più dell'ultima password. Questo può essere fatto facilmente memorizzando il n di sali e hash precedenti. Tuttavia, questo può non essere una buona idea .

Un modo per migliorarlo è memorizzare password simili , oltre alle password effettive.

Un altro modo sarebbe solo memorizzare parte dell'hash .

Naturalmente, puoi utilizzare entrambi gli approcci.

    
risposta data 24.02.2016 - 23:38
fonte

Leggi altre domande sui tag