Come verificare la presenza di password duplicate?

6

È possibile verificare se un determinato numero di persone utilizza la stessa password, senza rischiare di far uscire la password di qualcuno? Ho sentito che Google fa questo, non permettendo all'utente di impostare una password che utilizza 1000 persone. Cosa succede se gli utenti hanno accesso ai propri record (ad esempio database distribuiti)?

EDIT: il numero di utenti per quello che sto facendo in questo momento è 10-10K. Cosa succede se chiediamo a ciascun cliente se la sua password corrisponde a un determinato testo in modo anonimo (posso farlo con alcune crittografie RSA e roba del genere)? Funzionerebbe? O dovrei dare questa idea per sempre?

    
posta Behrooz 12.01.2015 - 00:19
fonte

4 risposte

12

Gli unici modi pratici per farlo sono di usare lo stesso salt per l'hashing di tutte le password (cattive) o per memorizzare le password in testo normale o crittografia reversibile (molto, estremamente grave).

Dato che questi approcci sono problemi di sicurezza grandi e più grandi, suppongo che Google non stia facendo nessuno dei due. Quello che potrebbero fare è smontare le oltre 1.000 password più comuni. C'è un elenco di password comuni qui: link (Si noti che se non si accettano i primi 10.000, per il utente "normale", hai annullato tutto.)

Modificato per aggiungere: Immagino che tu possa memorizzare le ultime password n e i loro (diversi) sali. Sembra un sacco di problemi.

    
risposta data 12.01.2015 - 01:31
fonte
9

Se stai memorizzando le password in modo corretto, cioè con PBKDF2 / BCrypt / SCrypt, quando l'utente sta cambiando la password puoi passare il tempo ad aggiungerlo con i sali di altri utenti (che sono, ovviamente, crittograficamente casuali e unici per utente), e se trovi una corrispondenza nella prima N, allora dillo al n. Se lo desideri, potrebbe controllare ogni utente, ma ciò richiederebbe una quantità proibita di tempo di elaborazione.

  • Se non richiede una quantità proibita di tempo di elaborazione, hai solo pochi utenti o devi aumentare il conteggio dell'iterazione / fattore di lavoro PBKDF2 / BCrypt / SCrypt.

Questa è una idea BAD , tuttavia, poiché offre all'utente A la possibilità di ottenere informazioni su ciò che gli altri utenti hanno come password, senza cercare effettivamente di accedere come loro.

Meglio, includi un controllo contro gli attacchi di dizionario basati su regole con un dizionario di piccole e medie dimensioni, usando quella password del candidato con testo non crittografato pre-hash. Vado più nel dettaglio in la mia risposta a , ma le basi sono:

  • Avere una lista di parole da piccole a medie, molto semplice, le lettere sono tutte maiuscole.
  • Codifica alcune "regole" da applicare alla password, proprio come Hashcat o John the Ripper

    • Puoi gestire tutte le regole maiuscole / minuscole con un semplice equivalente UPPER () e un dizionario tutto maiuscolo - se lo trovi, è debole. (Jacqueline)
    • Aggiungere / anteporre i numeri puramente per soddisfare i minimi di lunghezza è una semplice corrispondenza di modello - se l'ultimo / primo N carattere sono numeri, e la lunghezza rimanente non è sufficiente, è debole. (Riddick123)
    • Rimuovi N numeri dall'inizio / fine, in maiuscolo e controlla il dizionario per il resto (JacQueLine12)
    • Quanto sopra, ma numeri e / o simboli N-1 (# 1JacQueLine)
    • Quanto sopra, ma i formati della data. (JacQueLine02121995)
    • Se l'ultimo / primo carattere N-1 sono numeri e l'ultimo / primo è un simbolo e la lunghezza rimanente non è sufficiente, è debole. (! JacQueLine1)
    • Elimina un personaggio alla volta, verifica se corrisponde al dizionario. (Jacqu $ eline)
    • Combina alcuni di questi.
    • Ripristina tutto questo.
    • quindi passa alle combinazioni di parole del dizionario e così via.

Rifiuterei le password peggiori, assolutamente. Per un progetto avanzato, inizia con un controllo "peggiore" (le password peggiori in alto N e le regole di base) e respingi semplicemente quelle. Quindi, se non si verifica alcuna corrispondenza, prova un controllo "medio-peggiore" e dai un grande avvertimento rosso acceso. Quindi, se non si verifica alcuna corrispondenza, prova un controllo "peggiore" e invia un avviso più piccolo.

Se non si verifica alcuna corrispondenza, non dire nulla. Potrebbe essere ancora una password terribilmente brutta, semplicemente non hai controllato quella particolare combinazione di parola base + regola; non puoi mai sapere se una password è buona.

  • Esempio: "286755fad04869ca523320acce0dc6a4" sembra abbastanza casuale! È solo MD5 ("password") !!
    • Rendere il parlare in 1337 non aiuta.

Se gli utenti hanno accesso agli hash delle password e ai sali, possono eseguire strumenti come Hashcat o John the Ripper proprio come chiunque altro con un elenco di password (trapelate).

    
risposta data 12.01.2015 - 01:31
fonte
2

Se si utilizza qualcosa come un filtro Bloom, è possibile verificare se uno degli altri utenti sta già utilizzando quella password, ma sarebbe difficile stabilire quali utenti in particolare. C'è una possibilità per i falsi positivi ma non per i falsi negativi.

link

Concorda con l'altra risposta che, mentre è possibile, è una cattiva idea perché fornisce informazioni su quali password sono già state utilizzate.

Sono scettico sul fatto che questa sia una protezione preziosa. Certamente impedisce a un gran numero di persone di usare "abcdef" e "123456" ma se 10 dei tuoi utenti 1M scelgono una password strong, casuale, lunga, qual è il danno se usano lo stesso valore?

    
risposta data 16.01.2015 - 01:45
fonte
-2

Ho una soluzione parziale alla tua domanda originale. Da quello che ottengo, la tua intenzione è di verificare se un determinato numero di persone utilizza le stesse password.

Le risposte qui finora sembrano andare più nella direzione delle password sicure, il che è positivo. Mentre dovresti assicurarti password "forti", penso che non vuoi che un certo numero di persone utilizzi la stessa password, per quanto sicuro sia considerato.

Che cosa succede se lo fai? Mantieni un elenco di semplici hash non salati di password utente sul punto di registrazione. Come un hash SHA-512. (potresti anche fare ripetuti hash un certo numero di volte solo tu lo sai) L'elenco non ha nomi utente, solo hash delle password che possono essere di chiunque. Potresti anche andare oltre e implementarlo in una tabella, in modo tale che questo hash di pre-accettazione abbia un contatore a fianco, mostrando il numero di persone che usano una particolare password sul tuo sito. Nota che non c'è modo di dire la password originale.

Naturalmente, quando in realtà stai memorizzando il nome utente / password nel database, salirai e cancellerai l'hash. L'elenco di cui sopra è solo un elenco casuale di hash pre-salati di password insieme al numero di volte in cui è stato generato l'hash.

Ora, quando un nuovo utente sceglie una password, esegue l'hashing di pre-accettazione e controlla se tale hash è già presente nell'elenco e, in caso affermativo, quante volte è stato utilizzato l'hash? Se è stato utilizzato fino al numero massimo di volte che hai deciso, rifiuta semplicemente la password. All'ingresso di una password "riuscita", inserisci il nuovo hash pre-salato nell'elenco.

Idealmente, se gli utenti utilizzano password "forti" seguendo i criteri indicati da altre persone, il contatore di ciascun hash nell'elenco dovrebbe essere esattamente 1.

La soluzione è sicura, poiché anche se un utente malintenzionato ruba la lista non può utilizzare l'hash per accedere, in quanto non è la stessa dell'hash salato reale nel database. Inoltre è possibile utilizzare diversi algoritmi di hashing per frustrare il cracking. Questo, ovviamente, non significa che l'attaccante non possa provare i soliti mezzi che altri hanno menzionato. Quello che sto dicendo è che questa soluzione non compromette in alcun modo la sicurezza dei tuoi utenti.

Il lato negativo (e perché ho detto che è una soluzione parziale) è che se lo stesso utente cambia la sua password 3 volte al giorno, l'elenco viene modificato con l'hash pre-salato di ciascuna di queste password, anche se in realtà, nessuno sta usando nessuno di loro. E non c'è modo di verificare chi ha fornito quale hash come l'elenco, per ovvi motivi, non contiene nomi utente. È molto anonimo e dovrebbe essere!

In realtà c'è una correzione al ribasso, ma penso che sia meglio non menzionare. Fatemi sapere cosa ne pensate! Grazie e Dio ti benedica.

    
risposta data 16.01.2015 - 09:33
fonte

Leggi altre domande sui tag