Il modo migliore per crittografare un nome utente in un database?

1

Nel mio database, vorrei crittografare tutte le informazioni identificabili, incluso il nome utente, in modo che le persone con accesso al database non possano dedurre il nome utente effettivo (perché potrebbe potenzialmente indicare l'identità effettiva dell'utente).

Inoltre, gli utenti dovrebbero avere la possibilità di accedere.

Quale sarebbe la migliore strategia per raggiungere questo obiettivo?

Attualmente sto tagliando nome utente e password insieme (è corretto che non possa mai essere decifrato). Tuttavia, questo introduce la capacità di eseguire un attacco da tavolo arcobaleno (o?).

La mia prossima idea sarebbe quella di scartare una grossa parte dell'hash, abbastanza grande da far diventare inconcludente qualsiasi risultato di un attacco da tavolo arcobaleno. Ciò naturalmente introdurrebbe un tasso di collisione più elevato, il che è indesiderabile.

Quindi di nuovo, un attacco da tavolo arcobaleno sarebbe in grado di produrre una serie di candidati, il che non sarebbe positivo.

Esistono altre strategie conosciute per questo tipo di problema?

    
posta HelloWorld 13.12.2018 - 17:34
fonte

2 risposte

2

Esiste una soluzione standard per sconfiggere le tabelle arcobaleno: aggiungi un sale a ciò che stai facendo. Un salt è un valore casuale che viene generato separatamente per ogni hash della password e memorizzato insieme a quell'hash.

Questo, tuttavia, richiede che tu debba sapere quale hash stai verificando (a meno che tu non voglia provare ogni singola voce nel tuo database finché non ne trovi una che corrisponde, ovviamente.) Quando la tua soluzione non ha bisogno di scalare a un gran numero di account, questa potrebbe essere un'opzione praticabile). Quindi dovrai sapere a quale account l'utente vuole accedere prima di poter verificare se la loro password è corretta. Quello che potresti fare è avere tre colonne nel tuo database:

hash(username)
salt
hash(password + salt)

Quando qualcuno cerca di accedere con le credenziali admin : hunter2 , generi l'hash di admin . usalo per recuperare il sale, calcola l'hash di hunter2salt e verifica se corrisponde.

Ora è naturalmente possibile usare nomi utente forzati e farlo ancora più velocemente con un tavolo arcobaleno. Ma i nomi utente di solito non dovrebbero essere così sensibili come le password. Puoi renderlo meno conveniente usando una funzione slow has e usando un pepe (un sale che è lo stesso per ogni voce - funziona contro le tabelle arcobaleno precalcolate).

    
risposta data 13.12.2018 - 17:50
fonte
0

Dovresti considerare che la generazione di tabelle arcobaleno (RT) è un lavoro davvero difficile. Se qualcuno ruba tutta la tua base in una volta, allora sarà molto più veloce forzare tutte le coppie di username e password che vorrà controllare, quindi generare RT e cercare contro di essa.

Quindi, se usi il pepe, non dovresti preoccuparti di qualcuno che usa la RT nel caso in cui rubi tutti agli hash dell'utente. Nel caso in cui ottenga gli hash pezzo per pezzo (per esempio, scarta hash di nuovi utenti ogni giorno), quindi a lungo termine l'attaccante può trarre beneficio dalla generazione e dall'utilizzo di RT.

Coppia di username + password ha entropia più alta della sola password, rendendo molto difficile la generazione RT e la forza bruta (se non si memorizza hash (username) o qualsiasi l'altro modo compromette i nomi utente!). Penso che applicherei delle policy password (non troppo rigide) e non mi preoccuperei di un attacco RT.

    
risposta data 13.12.2018 - 21:57
fonte

Leggi altre domande sui tag