Elenco delle funzioni hash vulnerabili e "utilizzabili"

2

Cercando in Internet ho visto solo tabelle di famiglie di crittografia / hashing e la logica. Ho visto un video di recente da Computerphile sull'interruzione delle password utilizzando le regole del dizionario e i dump di password precedentemente interrotti. Alla fine del video, è stato detto che gli algoritmi di hash MD5 e SHA1 non sono più così sicuri e che se stai usando SHA1, dovresti passare a SHA256.

Voglio ricontrollare quali funzioni di hash sono forti, quali sono ancora utilizzabili e quali non sono più sicure (potrebbe essere a causa di vulnerabilità agli attacchi o di perdite massicce, ecc. ecc.) in una bella tabella.

Non sembra esserci una tabella utile per questo e dovresti passare attraverso ogni algoritmo che ti interessa e leggere la pagina wiki a riguardo e capire se è ancora vulnerabile o meno.

Esiste un elenco di questo tipo?

    
posta Razgriz 30.07.2016 - 17:00
fonte

2 risposte

7

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.

    
risposta data 30.07.2016 - 17:30
fonte
5

Questo video ignora completamente alcune delle parti più complesse dell'hash per le password. Ad esempio, non menziona nemmeno l'esistenza di schemi di hashing della password come scrypt, bcrypt, PBKDF2. Inoltre, confonde il normale hashing con l'hashing della password e parla continuamente di "memorizzare le password", che è esattamente ciò che non si fa quando si memorizza un hash della password. Si prega di non usarlo come materiale di riferimento.

La forza di MD5 o SHA-1 è completamente irrilevante nell'hash delle password. Se si vede un hash PBKDF2 su una password relativamente buona, un conteggio di sale e iterazione di grandi dimensioni (fattore di lavoro) che è stato configurato con SHA-1 o MD5 non avresti ancora alcuna possibilità di trovare la password. MD5 (praticamente) e SHA-1 (teoricamente) sono stati interrotti per quanto riguarda la ricerca di collisioni, ma non per quanto riguarda gli attacchi di pre-immagine.

Gli hash delle password sono in realtà funzioni abbastanza diverse dagli hash crittografici anche per quanto riguarda i parametri di configurazione e l'input. Gli hash delle password rientrano nella categoria Funzioni derivate chiave basate su password (PBKDF) che hanno una primitiva configurabile (funzione hash) e un fattore di lavoro. Inoltre, hanno il sale come parametro di input aggiuntivo. Le funzioni di hash hanno solo un input e output. Dovresti considerarle diverse funzioni e non confrontarle direttamente.

Se si desidera confrontarli con una funzione progettata per input ad alta entropia (password e tasti molto complessi), è possibile prendere in considerazione le funzioni di derivazione chiave basate su chiave (KBKDF) come HKDF. Questi algoritmi sono spesso basati anche su funzioni di hash, sebbene vengano usati anche disegni basati su cifrari a blocchi.

Oltre agli hash delle password già noti: scrypt, bcrypt e PBKDF2, c'è anche Argon2 che ha vinto la competizione di hashing delle password. PBKDF2 ha alcuni punti deboli purtroppo, ma è stato meglio standardizzato come parte dello standard PKCS # 5 / Crittografia basata su password e standardizzazione NIST.

Per gli hash crittografici è semplicemente meglio scegliere una qualsiasi delle varianti SHA-2 o SHA-3, standardizzate dal NIST.

Esistono un numero molto elevato di funzioni di hash della password e funzioni di hash crittografiche. Non sono tutti noti al grande pubblico. Queste funzioni possono essere suddivise in diversi modi. Quindi qualsiasi tabella sarebbe molto grande e non servirebbe a nessuno scopo.

    
risposta data 31.07.2016 - 13:16
fonte

Leggi altre domande sui tag