TL; DR
- Se i tuoi dati sono un messaggio lungo o hanno almeno 72 bit di entropia, utilizza SHA-256 .
- Se i tuoi dati sono una password, utilizza BCrypt , regolando il fattore di lavoro in circa 100 ms.
- Se i dati di input hanno troppo poca entropia, l'hashing (anche con BCrypt) non fornisce una sicurezza significativa.
- weak
password
s
- PIN a tutte le cifre
- numeri di conto bancario
Mentre è difficile elencare tutte le routine di hash, è facile elencare le routine più comuni e ancora più facile raccomandare quello che dovresti usare.
La famiglia di hash SHA-2 (da SHA-256 a SHA-512) è considerata una strong routine di hash General Purpose. SHA-256 funziona meglio per la maggior parte degli scopi.
MD5 è abbastanza debole e SHA-1 è accettabile. Mentre alcune persone potrebbero desiderare MD5 per essere più brevi (128 bit anziché 256), si sta effettivamente meglio troncando un moderno hash. Ovviamente è meglio usare l'intera lunghezza hash di 256 bit.
Tieni presente che le routine Hash General Purpose come MD / SHA sono progettate per essere veloci . Per la maggior parte dei programmi per computer, veloce è considerato buono.
Tuttavia, se il valore di input originale ha entropy (ad esempio un pin a 4 cifre), sarà molto facile eseguire la forza bruta (provare tutti i 10.000 valori di input possibili e confrontarli con ) l'hash, determinando così i dati altrimenti segreti.
- PIN a 4 cifre = 13 bit di entropia (non può essere reso abbastanza sicuro dall'hash)
- 18 caratteri veramente casuali Stringa esadecimale = 72 bit entropia
- 12 caratteri veramente casuali Base64 stringa = 72 bit entropia
- 8 caratteri
password
da un utente pigro = quasi nessuna entropia
- Password di 11 caratteri con alcuni trucchi di sostituzione comuni
Tr0ub4dor&3
= circa 28 bit di entropia
- numero della carta di credito = non abbastanza entropia quindi non memorizzare nemmeno il suo hash
- messaggio di posta elettronica o qualsiasi file di testo di grandi dimensioni = molta entropia
Ogni bit di entropia significa che impiega il doppio del tempo per forzare i dati.
Il tempo necessario alla forza bruta dipende dalla velocità dell'hardware dell'attaccante e dalla velocità dell'hash. Così,
-
Se i tuoi dati di input hanno 72 bit di entropia o meglio, usa semplicemente SHA-256.
-
Se i tuoi dati di input hanno meno entropia o entropia non attendibile (password fornite dall'utente), allora dovresti usare un Hash lento .
Le routine di hash lento sono regolabili, in modo che, invece di completare l'operazione di hash in pochi microsecondi, siano necessari diversi millisecondi (consiglio circa 100ms) sull'hardware di produzione. (nota che l'hardware dell'attaccante sarà probabilmente molto più veloce)
Ecco alcune buone scelte di Slow Hash.
Ognuno ha un mezzo per regolare il tempo di elaborazione. (forza dell'hash)
-
Ripeti l'hash SHA-256 (o SHA-512) molte volte.
Questo è semplice da implementare e considerato una tecnica ragionevole. (nonostante il fatto che SHA sia stato progettato per essere veloce)
-
BCrypt (hash lento comunemente consigliato)
-
SCrypt (più recente (meno provato), progettato per essere resistente alle GPU a causa dei requisiti di RAM)
-
PBKDF2 (vecchia, buona alternativa a BCrypt)
Nota: l'ottimizzazione della tua funzione di hash è importante. Usa la versione nativamente compilata di BCrypt, non un 'scritto in' un linguaggio di alto livello (cioè JBCrypt è stato scritto in Java), come la versione Natively Compiled (scritta in C / C ++, con il corretto collegamento al tuo linguaggio di alto livello) essere più efficiente, consentendo quindi di calcolare un fattore di lavoro più elevato (più strong) nello stesso intervallo di tempo.
È comune aggiungere Salt a un hash. Questo è univoco, ma non segreto, e viene aggiunto alla password prima che venga generato l'hash. In questo modo, se un utente malintenzionato ruba il tuo database ed esegue brute-force su tutti gli hash, dovrà eseguire un brute separato per ogni Salt utilizzato, il che richiederà un po 'più di tempo rispetto a brute-forzare tutte le password in un singolo lavoro.