Hashing password e gestione dei duplicati

8

Attualmente il mio progetto utilizza ancora l'hashing MD5 per crittografare le password. Sì, lo so.

Sto pianificando di aggiornare il sistema di password per utilizzare le nuove funzioni password_hash e password_verify in PHP, che miglioreranno la sicurezza delle password degli utenti.

Tuttavia, il mio team di moderatori ha espresso preoccupazione: poiché una delle nostre regole di base vieta agli utenti di avere più di un account, hanno bisogno di modi per dire se due account appartengono alla stessa persona. Uno di questi metodi è quello di verificare se gli hash MD5 sono gli stessi nei due account sospetti: in tal caso, gli account hanno la stessa password e il sospetto si intensifica. Ma con il nuovo sistema proposto, questo non sarà più possibile perché verranno creati diversi hash sui due account.

Nell'interesse di trovare un compromesso, esiste un modo per utilizzare la migliore sicurezza di password_hash , fornendo al contempo un modo per il team del moderatore di rilevare quando due account condividono la stessa password?

I miei pensieri al momento coinvolgono l'hashing della password in qualche altro modo che produrrà lo stesso hash per la stessa password, ma sono preoccupato che questo reintroduca la stessa vulnerabilità che stiamo cercando di scappare muovendo lontano da MD5. Ci sono delle opzioni qui o dovrò usare Executive Decision Power per annullare la preoccupazione?

    
posta 20.11.2015 - 12:14
fonte

4 risposte

40

Uno dei motivi per cui password_hash produce risultati diversi per la stessa password è prevenire le fughe di informazioni e rendere le password più difficili da decifrare se gli hash vengono ottenuti da un utente malintenzionato. Non si vuole davvero compromettere questa funzione di sicurezza, non solo si riduce la protezione dei dati dei clienti, ma si arrotonda la propria soluzione anziché utilizzare soluzioni ben supportate e accettate.

L'utilizzo di una password identica per rilevare più account da parte dello stesso titolare dell'account è comunque una cattiva idea: è destinato a causare falsi positivi e causare blocchi di account legittimi.

    
risposta data 20.11.2015 - 12:39
fonte
21

Il problema X Y

Quello che hai è il classico XY Problem (xyproblem.info ). Vuoi impedire agli utenti di avere più account e pensa erroneamente che l'implementazione di un sistema di password non funzionante e il confronto degli hash ti aiuteranno a risolvere questo problema. Quindi hai chiesto come rilevare password identiche. Come ha descritto la risposta di @Ggd, tentare ciò causa falsi positivi, è facilmente aggirabile e ti costringe a buttare fuori le pratiche di gestione della password provate e vere.

Risoluzione del tuo vero problema

La tua domanda reale dietro la domanda è "Come posso impedire agli utenti di avere più account?". Questa domanda è stato chiesto prima . Tuttavia, una domanda è del 2008 e menziona anche "Account con la stessa password" come fattore di mitigazione, e l'altra non è stata inserita in sufficienti dettagli / opzioni, quindi sembra che questo problema dovrebbe essere rivisitato.

Come voi e la vostra azienda avete già scoperto, non esiste una soluzione semplice e infallibile per questo. Quello che puoi fare è avere uno sforzo multi-front intelligente per minimizzare il problema. I controlli validi includono:

  • Registrazione IP : questo può creare falsi positivi per i gruppi che condividono un singolo IP pubblico e deve essere evitato utilizzando proxy, tor o richieste DHCP. Può, tuttavia, essere un buon primo passo per indagare sulla possibilità.
  • Verifica email : richiedere all'utente di fornire e fare clic su una verifica tramite email è un altro controllo valido, ma facilmente indirizzato.
  • Verifica telefono cellulare : simile all'email, ma richiede la convalida tramite SMS in entrambe le iscrizioni (meno intrusivo) o accesso (più intrusivo, possibile DoS se telefono / segnale non è disponibile).
  • Segui i soldi : richiedi una carta di credito o un link a un conto PayPal (o altro servizio) valido. È possibile eseguire una micro-transazione e richiedere i dettagli per dimostrare che l'account è sotto il controllo dell'utente.
  • Credenziali specifiche del dominio : esiste una certificazione richiesta per la base di utenti (ad esempio, un sito per infermieri registrati potrebbe richiedere un numero di licenza valido)?

Le soluzioni pratiche al tuo problema richiederanno senza dubbio un equilibrio. Non si vuole scoraggiare gli utenti con una barriera d'ingresso troppo alta, a meno che non si sia più interessati a "una persona, un conto" rispetto alla crescita e alla trazione. Sicuramente non vuoi mettere in pericolo la sicurezza dell'account dei tuoi utenti con un sistema di password errato come parte di questo trade-off: i costi legali, finanziari e di reputazione di una violazione superano di gran lunga qualsiasi beneficio (dubbio).

    
risposta data 20.11.2015 - 18:07
fonte
6

Direi che esiste un modo per farlo in modo sicuro - basato su questa affermazione nella tua domanda:

One such way that they have used is to check if the MD5 hashes are the same on the two suspect accounts

Ciò che questo richiede è un modo per identificare automaticamente qualsiasi coppia di account utilizzando la stessa password. Hai solo bisogno di un modo per decidere se un paio di account condividono la stessa password una volta che c'è già un sospetto.

In base a ciò risolverei il problema in questo modo:

  1. Salva la password in modo sicuro utilizzando un hash salato.
  2. Crea una tabella aggiuntiva che elenca coppie di account sospettati di utilizzare la stessa password e uno stato per ciascuna coppia.
  3. Quando si sospetta che una coppia usi la stessa password, inseriscila nella tabella dei sospetti con stato impostato su sconosciuto .
  4. Dopo ogni accesso riuscito, cerca l'utente nella tabella sospetta.
  5. Se l'utente viene trovato nella tabella sospetta, prova la password con l'altro utente in quella coppia. Se lo stato è sconosciuto , modificalo in identico o diverso .

Ovviamente come altri hanno sottolineato, la password identica è solo un segnale di molti. L'approccio più affidabile sarebbe quello di combinare molti segnali diversi. Il metodo di verifica che propongo qui dovrebbe essere utilizzato solo come ultima misura se farebbe la differenza tra il sospetto di essere al di sotto o al di sopra della soglia per agire.

Se gli altri segnali possono chiaramente mettere le coppie di account su un lato della soglia indipendentemente dall'equivalenza delle password, in primo luogo non è necessario inserirlo nella tabella dei sospetti.

    
risposta data 20.11.2015 - 20:29
fonte
4

C'è un modo per verificare che una password non corrisponda a nessuna password.

Potresti, al cambio della password, verificare quella singola password contro ogni altra password nel database poiché avrai la password non criptata. Questo potrebbe richiedere del tempo, ma è fattibile. Questo potrebbe facilmente portare a un attacco DoS in quanto una singola azione potrebbe causare una CPU elevata per un tempo prolungato. Inoltre, è possibile tenere in considerazione le schede in base alle quali gli utenti possono utilizzare password corrispondenti per dare la priorità alle password da violare. Un utente malintenzionato che ha già tutte le password e un elenco di utenti con password corrispondenti potrebbe tentare di forzare prima le password con più account.

Come espresso da altre risposte, non penso che questo dovrebbe essere un metodo utilizzato per determinare account duplicati. Più account acceduti dallo stesso IP probabilmente fornirebbero meno falsi positivi. Sarebbe meglio installare un cookie che indica l'ultimo utente che ha effettuato l'accesso e registrarsi in modo silenzioso quando quel cookie non corrisponde all'utente che sta attualmente effettuando l'accesso.

    
risposta data 20.11.2015 - 18:05
fonte

Leggi altre domande sui tag