it-swarm-eu.dev

Quanto tempo per forzare la forza di un hash SHA-512 salato? (sale fornito)

Ecco un algoritmo in Java:

public String getHash(String password, String salt) throws Exception {
    String input = password + salt;
    MessageDigest md = MessageDigest.getInstance(SHA-512);
    byte[] out = md.digest(input.getBytes());
    return HexEncoder.toHex(out);
}

Supponiamo che il sale sia noto. Voglio sapere il momento di forzare la forza quando la password è una parola del dizionario e anche quando non è una parola del dizionario.

54
timothyjc

Nel tuo caso, rompere l'algoritmo hash equivale a trovare una collisione nell'algoritmo hash. Ciò significa che non è necessario trovare la password stessa (che sarebbe un attacco preimage ), devi solo trovare un output della funzione hash uguale all'hash di una password valida ( quindi "collisione"). Trovare una collisione usando un attacco di compleanno richiede O (2 ^ (n/2)) tempo, dove n è la lunghezza di uscita della funzione hash in bit.

SHA-2 ha una dimensione di uscita di 512 bit, quindi trovare una collisione richiederebbe O (2 ^ 256) tempo. Dato che non ci sono attacchi intelligenti all'algoritmo stesso (attualmente nessuno è noto per la famiglia di hash SHA-2) questo è ciò che serve per rompere l'algoritmo.

Per avere un'idea di cosa significhi effettivamente 2 ^ 256: attualmente si ritiene che il numero di atomi nell'universo (intero !!!) sia all'incirca 10 ^ 80 che è all'incirca 2 ^ 266. Supponendo che l'input a 32 byte (che è ragionevole per il tuo caso - 20 byte di sale + 12 byte di password) la mia macchina impiega ~ 0,22s (~ 2 ^ -2s) per 65536 (= 2 ^ 16) calcoli. Quindi 2 ^ 256 calcoli verrebbero eseguiti in 2 ^ 240 * 2 ^ 16 calcoli che prenderebbero

2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years

Anche chiamare questo milione di anni è ridicolo. E non c'è niente di meglio con l'hardware più veloce del pianeta che calcola migliaia di hash in parallelo. Nessuna tecnologia umana sarà in grado di ridurre questo numero in qualcosa di accettabile.

Quindi dimentica qui SHA-256 a forza bruta. La tua prossima domanda riguardava le parole del dizionario. Per recuperare password così deboli tabelle Rainbow venivano usate tradizionalmente. Una tabella Rainbow è generalmente solo una tabella di valori hash pre-calcolati, l'idea è se tu fossi in grado di pre-calcolare e memorizzare ogni possibile hash insieme al suo input, quindi ti porterebbe O(1) per cercare un determinato hash e recuperare un valido preimage per esso. Naturalmente questo non è possibile in pratica poiché non esiste un dispositivo di archiviazione in grado di archiviare quantità così enormi di dati. Questo dilemma è noto come compromesso della memoria . Dato che sei in grado di memorizzare solo tanti valori, le tipiche tabelle Rainbow includono una qualche forma di concatenamento di hash con funzioni di riduzione intermedia (questo è spiegato in dettaglio nell'articolo di Wikipedia) per risparmiare spazio rinunciando a un po 'di risparmi nel tempo .

I sali rappresentavano una contromisura per rendere impossibili tali tavoli Rainbow. Per scoraggiare gli aggressori dal pre-calcolare una tabella per un sale specifico, si consiglia di applicare i valori di sale per utente. Tuttavia, poiché gli utenti non usano password sicure e completamente casuali, è ancora sorprendente quanto riesci a ottenere se il sale è noto e si esegue l'iterazione su un grande dizionario di password comuni in un semplice schema di prova ed errore. La relazione tra linguaggio naturale e casualità è espressa come entropia . Le scelte di password tipiche sono generalmente di bassa entropia, mentre valori completamente casuali conterrebbero un massimo di entropia.

La bassa entropia delle password tipiche rende possibile che vi sia una possibilità relativamente elevata di utilizzo da parte di uno dei tuoi utenti di una password proveniente da un database relativamente piccolo di password comuni. Se vai su Google per loro, finirai per trovare i collegamenti torrent per tali database di password, spesso nella categoria dimensioni gigabyte. Avere successo con un tale strumento è di solito nell'intervallo da minuti a giorni se l'attaccante non è limitato in alcun modo.

Ecco perché generalmente l'hashing e la salatura da soli non sono sufficienti, è necessario installare anche altri meccanismi di sicurezza. È necessario utilizzare un metodo che rallenta artificialmente l'entropia come PBKDF2 descritto in PKCS # 5 e si dovrebbe applicare un periodo di attesa per un determinato utente prima che possano riprovare a immettere la password. Un buon schema è iniziare con 0,5 secondi e poi raddoppiare quel tempo per ogni tentativo fallito. Nella maggior parte dei casi gli utenti non lo notano e non falliscono molto più spesso di tre volte in media. Ma rallenterà in modo significativo qualsiasi outsider dannoso che tenta di attaccare l'applicazione.

115
emboss

Voglio sapere il momento di forzare la forza quando la password è una parola del dizionario e anche quando non è una parola del dizionario.

Password del dizionario

Figura di Ballpark: ci sono circa 1.000.000 di parole inglesi e se un hacker può calcolare circa 10.000 hash SHA-512 al secondo ( aggiornamento: vedi commento di CodesInChaos, questa stima è molto bassa), 1.000.000/10.000 = 100 secondi . Quindi ci vorrebbe poco più di un minuto per decifrare una password del dizionario di una sola parola per un singolo utente. Se l'utente concatena due parole del dizionario, ti trovi nell'area di pochi giorni, ma è ancora molto possibile se l'attaccante è abbastanza preoccupato. Più di questo e inizia a diventare duro.

Password casuale

Se la password è una sequenza veramente casuale di caratteri alfanumerici, maiuscoli e minuscoli, allora il numero di possibili password di lunghezza N è 60 ^ N (ci sono 60 possibili caratteri). Questa volta faremo il calcolo nell'altra direzione; chiederemo: Qual è la lunghezza della password che potremmo decifrare in un determinato periodo di tempo? Usa questa formula:

N = Log60(t * 10,000) dove t è il tempo impiegato a calcolare gli hash in secondi (assumendo di nuovo 10.000 hash al secondo).

1 minute:    3.2
5 minute:    3.6
30 minutes:  4.1
2 hours:     4.4
3 days:      5.2

Quindi dopo 3 giorni saremmo in grado di decifrare la password se è lunga 5 caratteri.

Tutto questo è un grande parco giochi, ma hai l'idea. Aggiornamento: vedi commento sotto, in realtà è possibile decifrare password molto più lunghe di così.

Cosa sta succedendo qui?

Risolviamo alcune idee sbagliate:

  • Il sale non rallenta il calcolo degli hash , significa solo che devono decifrare la password di ogni utente singolarmente e tabelle hash pre-calcolate (buzz -Word: Rainbow tables) sono resi completamente inutili. Se non hai una tabella hash precompilata e stai solo rompendo un hash password, il salting non fa alcuna differenza.

  • SHA-512 non è progettato per essere difficile da forzare . Algoritmi di hashing migliori come BCrypt, PBKDF2 o SCrypt possono essere configurati per richiedere molto più tempo per il calcolo e un computer medio potrebbe essere in grado di calcolare solo 10-20 hash un secondo. Leggi Questa eccellente risposta sull'hash della password se non l'hai già fatto.

  • aggiornamento: come scritto nel commento di CodesInChaos, anche le password ad alta entropia (circa 10 caratteri) potrebbero essere rinforzate se si utilizza l'hardware giusto per calcolare gli hash SHA-512.


Note sulla risposta accettata:

La risposta accettata a partire da settembre 2014 è errata e pericolosamente sbagliata:

Nel tuo caso, rompere l'algoritmo hash equivale a trovare una collisione nell'algoritmo hash. Ciò significa che non è necessario trovare la password stessa (che sarebbe un attacco preimage) ... Trovare una collisione usando un attacco di compleanno richiede O (2 ^ n/2) tempo, dove n è la lunghezza di output dell'hash funzione in bit.

L'attacco per il compleanno è completamente irrilevante per rompere un determinato hash. E questo è in effetti un perfetto esempio di attacco preimage. Quella formula e il prossimo paio di paragrafi danno luogo a valori pericolosamente alti e completamente privi di significato per un tempo di attacco. Come dimostrato sopra è perfettamente possibile decifrare le password del dizionario salate in pochi minuti .

La bassa entropia delle password tipiche rende possibile che ci sia una probabilità relativamente alta di uno dei tuoi utenti di utilizzare una password da un database relativamente piccolo di password comuni ...

Ecco perché generalmente l'hashing e la salatura da soli non sono sufficienti, è necessario installare anche altri meccanismi di sicurezza. Dovresti usare un metodo che rallenta artificialmente l'entropia come PBKDF2 descritto in PKCS # 5 ...

Sì, si prega di utilizzare un algoritmo che è lento da calcolare, ma che cos'è "entropia-enducing"? Inserire una password di bassa entropia attraverso un hash non aumenta l'entropia. Dovrebbe preservare entropia, ma non puoi migliorare una password di immondizia con un hash, non funziona così. Una password debole inserita in PBKDF2 è ancora una password debole.

32
George Powell

Non c'è una sola risposta a questa domanda in quanto ci sono troppe variabili, ma SHA2 non è ancora veramente crackato (vedi: Durata delle funzioni hash crittografiche ) quindi è ancora un buon algoritmo da usare per memorizzare le password. L'uso di salt è buono perché impedisce l'attacco da attacchi da dizionario o dalle tabelle Rainbow. L'importanza di un salt è che dovrebbe essere univoco per ogni password. È possibile utilizzare un formato come [salt 128 bit] [hash password 512 bit] quando si memorizzano le password con hash.

L'unico modo possibile per attaccare è in realtà calcolare gli hash per le diverse possibilità di password e infine trovare quello giusto abbinando gli hash.

Per dare un'idea di quanti hash si possono fare in un secondo, penso che Bitcoin sia un esempio decente. Bitcoin usa SHA256 e, per farla breve, più hash generi, più bitcoin ottieni (che puoi scambiare con soldi veri) e come tali persone sono motivate a usare GPU per questo scopo. Puoi vedere nella panoramica dell'hardware che una scheda grafica media che costa solo $ 150 può calcolare più di 200 milioni di hash/s. Più lunga e complessa è la password, più tempo ci vorrà. Calcolando a 200 M/s, per provare tutte le possibilità per un carattere alfanumerico di 8 caratteri (maiuscolo, numero inferiore, numeri) ci vorranno circa 300 ore. Molto probabilmente il tempo reale diminuirà se la password è idonea o una parola inglese comune.

In quanto tale, con qualsiasi cosa di sicurezza è necessario esaminare nel contesto. Qual è la motivazione dell'attaccante? Qual è il tipo di applicazione? Avere un hash con salt casuale per ognuno offre un'ottima protezione contro i casi in cui qualcosa come migliaia di password è compromessa.

Una cosa che puoi fare è anche aggiungere un'ulteriore protezione della forza bruta rallentando la procedura di hashing. Poiché hai solo una volta le password di hash e l'attaccante deve farlo molte volte, questo funziona a tuo favore. Il modo tipico di fare è prendere un valore, l'hash, prendere l'output, l'hash ancora e così via per un numero fisso di iterazioni. Ad esempio, puoi provare qualcosa come 1.000 o 10.000 iterazioni. Ciò renderà molte volte più lento per l'attaccante trovare ogni password.

8
Can Gencer