Ok, quindi il sito genera una password casuale per ciascun utente al momento della registrazione. Una domanda importante è se un utente può impostare manualmente la propria password in un secondo momento o se è costretta a utilizzare una password generata dal sito casuale. Diamo un'occhiata ai due casi separatamente.
Password casuali
Per quanto posso dire, questo è lo scenario che stai descrivendo nella domanda. Sfortunatamente, il tuo dev è (principalmente) giusto . Almeno sulla singola iterazione dell'hashing rispetto a un grosso hash lento. La tua domanda ha il sapore di applicare ciecamente le "migliori pratiche" senza considerare a quali erano destinate tali pratiche. Per un brillante esempio di questo, ecco una buona lettura:
Il ragazzo che ha inventato quelle fastidiose regole di password ora rimpiange di sprecare il tuo tempo
Suggerimento
Passa da MD5
a SHA256
, probabilmente aggiungi un sal per utente e forse prendi in considerazione di passare a 32 caratteri. Tuttavia, l'aggiunta di una grande funzione di hashing lento aumenterà il carico del tuo server per poca o nessuna sicurezza aggiuntiva (almeno escludendo qualsiasi altro goof nella tua implementazione).
Comprensione dell'hash come attenuazione della forza bruta
La quantità di lavoro che un hacker con forza bruta che ha rubato il tuo database deve fare per rompere gli hash delle password è all'incirca:
entropy_of_password * number_of_hash_iterations * slowness_of_hash_function
dove entropy_of_password
è il numero di possibilità, o "indovinabilità" della password. Finché questa "formula" è superiore a 128 bit di entropia (o un equivalente fattore di lavoro / numero di istruzioni di hash da eseguire), allora sei bravo. Per le password scelte dall'utente, entropy_of_password
è abissalmente bassa, quindi hai bisogno di molte iterazioni (come 100.000) di una funzione hash molto lenta (come PBKDF2
o scrypt
) per ottenere il fattore di lavoro in su.
Per "cifre esadecimali di 20 cifre" presumo tu voglia dire che ci sono 16 20 = 2 80 password possibili, che è inferiore alla "best practice" 2 < sup> 128 , ma a meno che tu non sia un governo o una banca, probabilmente hai abbastanza sicurezza della forza bruta dall'entropia della sola password.
Anche qui i sali non servono a niente perché il pre-calcolo di tutti gli hash è come 2 80 * 32 bit / hash, che è approssimativamente 1 ZB (o 5000 x la capacità di tutti i dischi rigidi del pianeta messi insieme ). Le tabelle Rainbow aiutano un po 'questo, ma francamente, qualsiasi attaccante capace di farlo, merita di impegnarci tutti.
Si desidera ancora hash la password per impedire all'utente malintenzionato di liberare il testo in chiaro gratuitamente, ma una iterazione hash è sufficiente. Passa da MD5
a SHA256
, e forse prendi in considerazione di passare a 32 caratteri.
Password del cervello umano
I commentatori di questo thread sembrano ossessionati dall'idea che, nonostante la tua affermazione che il sito genera password, gli utenti possono infatti scegliere le proprie password.
Non appena l'utente ha la possibilità di cambiare la password, la singola iterazione hash non è un'opzione per memorizzare la password ora a bassa entropia. In questo caso, hai ragione sul fatto che devi fare tutte le operazioni migliori per l'archiviazione delle password.
La salatura
In ogni caso (password scelta dall'utente o casuale) probabilmente vuoi un utente per utente.
Se scelto dall'utente , i sali fanno parte delle migliori pratiche. 'ho detto.
Se casuale , @GordonDavisson sottolinea un attacco davvero bello nei commenti [1] , [2] basato sull'osservazione che una ricerca db è essenzialmente gratuita rispetto a a un calcolo hash. Calcolare un hash e confrontarlo con tutti gli hash degli utenti equivale essenzialmente al confronto con hash di un utente specifico . Finché sei felice di entrare in qualsiasi account (piuttosto che cercare di crackare un account specifico ), più utenti nel sistema, più efficiente è l'attacco.
Ad esempio, supponi di aver rubato la password hash non salda db di un sistema con un milione di account (circa 2 20 ). Con 2 20 account, ti aspetti statisticamente di ottenere un riscontro nelle prime 2 supposizioni 60 . Stai ancora facendo O (2 80 ) indovina , ma O (2 60 ) hash * O (2 20 ) db lookups ~ = O (2 60 ) hash.
I sali per utente sono l'unico modo per impedire a di attaccare tutti gli utenti per il costo di attaccare un utente .