Come dovrei scegliere un fattore di difficoltà per la mia funzione di hashing della password?

10

Supponendo che sto eseguendo correttamente l'hashing della password e utilizzando bcrypt, scrypt o PBKDF2, come dovrei scegliere un fattore di difficoltà appropriato? I round per bcrypt, iterazioni per PBKDF2 e maxtime, maxmem o maxmemfrac per scrypt.

Supponiamo anche che lo scenario peggiore si verifichi e che l'hash e il sale del mio utente (e qualsiasi applicazione, sale o pepe.) ... si sa ... worst-case .) accidentalmente o deliberatamente.

Ho bisogno di scegliere un valore che sia:

  1. Abbastanza facile per me.
  2. Troppo difficile per un utente malintenzionato.

La prima parte è relativamente facile. Se scelgo un numero sufficiente di round per fare in modo che bcrypt impieghi 0,5 secondi, posso essere sicuro che i miei utenti non vedranno un rallentamento significativo al momento dell'accesso. (In un'app web, comunque, 0,5 secondi non sono molto lunghi.) So anche testando un loop su quella funzione che posso gestire molti più accessi al minuto di quelli che sto vedendo attualmente. Se la velocità di accesso aumenta, posso ridurre il numero di round e migrare gli utenti mentre ognuno accede o posso aspettare un hardware migliore e più economico. Quando naturalmente sto migliorando, l'hardware più economico nel mio ciclo di aggiornamento posso aumentare i turni per compensare.

La domanda a cui è più difficile rispondere è quanto sia difficile troppo difficile per un utente malintenzionato. Ovviamente dipende dal valore delle password di un determinato utente malintenzionato ma, per questa domanda, non assume alcun valore speciale oltre al fatto che la maggior parte di queste combinazioni utente / password funzionerà su altri siti che effettivamente hanno un valore.

Se cambio il numero di colpi di bcrypt in modo che ora impieghi 0,01 secondi anziché 0,5, questo ha cambiato l'equazione per l'attaccante in modo che la password forzata bruta valga ora più del costo per forzarla? Come posso sapere se ha o no?

Sembra che questo sia abbastanza facile da calcolare in base alla conoscenza di quanto segue:

  1. Quanto vale una coppia nome utente / password generica.
  2. Quanto costa a forza bruta un hash di $ hash_function con $ difficoltà_fattore.

Poiché lo scrypt è stato progettato per essere più duro della memoria piuttosto che duro per la CPU, la risposta a 2. varierà in modo diverso a seconda dell'algoritmo. Non si tratta di un aumento della velocità lineare con l'aumentare della velocità della CPU / GPU o la diminuzione dei prezzi della RAM.

C'è un posto dove posso trovare le informazioni di cui sopra che vengono aggiornate non appena il nuovo hardware diventa disponibile?

La migliore risorsa che ho trovato finora per il valore di una password è post di Brian Krebs come questo e questo . Per hash crackizzati al secondo, è il "Crack me if can" contest a DEFCON . Gli hash crackizzati per dollaro sarebbero carini.

Ignora nelle tue risposte eventuali difetti algoritmici in questi algoritmi. Se viene trovato uno di questi, vorrei semplicemente passare ad uno degli altri algoritmi alternativi. Suppongo che se in una di queste fosse presente una falla, si tratterà di tutte le notizie sulla sicurezza.

Hai appena trovato su Crypto.SE questa tabella da paper defining scrypt :

Tutto quello di cui ho bisogno è che la tabella venga aggiornata ogni anno.

    
posta Ladadadada 21.06.2012 - 14:35
fonte

3 risposte

6

Sfortunatamente, l'ampia varietà di hardware impedisce la costruzione di tabelle come quella che si desidera a meno che non si effettui prima un rilevamento di tutte le architetture hardware esistenti e le migliori implementazioni bcrypt / scrypt / PBKDF2 per tale architettura. Anche il tavolo nell'articolo scrypt non è quello che vuoi: non ti dice quanto costerebbe per un attaccante; indica quanto sarebbe costato a un utente malintenzionato con l'hardware e il software a cui pensava lo scrypt designer quando scriveva l'articolo .

Tali stime non si adattano bene, a proposito. Se fossi un attaccante di fronte a un costo di attacco stimato in 10 miliardi di dollari con l'hardware disponibile, per prima cosa investirò un miliardo di dollari nella costruzione di un sistema basato su ASIC personalizzato che sarebbe più veloce per quel lavoro. Un PC è buono a fare gli accessi RAM pseudocasuali, ma non a l'hardware migliore possibile per quello, se non altro perché ci sono molti altri componenti in un PC, che sono inutili per un attacco.

Almeno, per PBKDF2, poiché il calcolo esegue il mapping alla funzione di hash sottostante senza problemi di accesso alla memoria, è possibile utilizzare i benchmark delle funzioni hash esistenti per ottenere un'idea (ad esempio questi ).

Detto questo, non tutto è perduto. Non otterrai stime accurate dei costi di attacco, ma ciò non significa che tutto ciò che puoi fare è lamentarti, avvizzire e morire. Un primo metodo pragmatico è impostare il conteggio delle iterazioni più alto possibile : impostarlo sul valore più alto che non rallenta in modo intollerabile il normale processo di accesso. In questo modo, non saprai se la tua sicurezza è buona , ma sarà buona come può ottenere . Che è una consolazione.

Il resto del lavoro sarà dal lato degli utenti. Dopo tutto, il fattore di difficoltà nell'hash delle password è lì per contrastare la legge di Moore. Tuttavia, nella migliore delle ipotesi, questa è una corrispondenza tra entropia della password e la pazienza dell'attaccante :

  • Il vantaggio dell'attaccante è che è più ricco, può acquistare hardware dedicato ed è paziente : può permettersi di trascorrere un'ora, forse un giorno, per craccare una password di alto valore; mentre l'utente non tollererà l'attesa per più di un secondo durante l'accesso.
  • Il vantaggio del difensore è entropia della password .

Contabile per un fattore di efficienza di 1000 per l'attaccante (hardware dedicato, più gettoni in esso) e un fattore di pazienza di 86400 (l'attaccante vuole riuscire entro un giorno, l'utente non aspetterà più di un secondo), quindi l'entropia della password deve superare 86 milioni (ovvero un po 'più di 26 bit) se il difensore è vincere la partita. Per aumentare l'entropia della password, c'è solo un modo: educare, educare ed educare di nuovo. Non cercare di applicare le "regole per la password", ma piuttosto antagonizzare gli utenti anziché creare password complesse. Invece, fornire un pulsante non obbligatorio generatore di password, che produce password con, ad esempio, 40 bit di entropia, e spiegare agli utenti che usare il pulsante sarebbe un'ottima idea.

    
risposta data 20.01.2013 - 23:40
fonte
1

Usando l'hardware di destinazione, selezionerei un costo che fa sì che l'algoritmo impieghi circa 1/10 di secondo. Implementare un ritardo dopo i tentativi di accesso falliti. Non sarà economicamente conveniente forzare con forza qualsiasi password che non sia stata scelta in modo terribile (ad esempio nome utente, nome del sito, "password"). Il valore effettivo che scegli dipende dall'hardware di destinazione.

    
risposta data 26.06.2012 - 02:10
fonte
0
    La velocità dell'algoritmo
  1. non ha importanza se le password sono deboli.
  2. se la password è in un dizionario, sei quasi istantaneamente avvitato
  3. se la password è generata da una regola che è inclusa con JtR o Hashcat, sei fottuto un po 'più tardi;)

Oltre a questo, quanti utenti / password stai memorizzando? Se si sta proteggendo solo un account (si pensi a un server con solo l'account di root su di esso), quindi la salatura è discutibile.

Quanto spesso sei costretto a cambiare le password? Se la difficoltà della password costringerà l'attaccante a un set completo di caratteri, password bruteforce lunga, allora puoi fare un'approssimazione decente: NumberOfCombos / CrackSpeed = TimeToCrack

Quindi se hai un ASCII stampabile di 6 caratteri, completamente casuale, (95 simboli) che puoi decifrare 100 al secondo, hai 95 ^ 6/100 = 233 anni per strappare l'intero spazio delle chiavi.

Tuttavia, se stai usando un algo veloce (la mia GPU rompe un singolo MD5 non salato a 8 miliardi / sec) e lanciando hardware decente, puoi craccare l'intero spazio tasti di 6 caratteri in circa 90 secondi. Andando alla lunghezza 7 con lo stesso set di caratteri si allunga il tempo di crackare a > 2 ore e la lunghezza 8 si estende a 9 giorni. Quindi, se cambi le tue password ogni 90 giorni, questo dà all'aggressore un sacco di tempo per craccare e usare quella lunghezza 8, la password di charset 95.

La regola è semplice, più grande è il tuo charset e più tempo fai la password, lo spazio delle chiavi crescerà a un ritmo ridicolo. I moderni hardware e software rendono il cracking molto veloce, ma puoi mitigare la minaccia con sali / alghe. Il vero killer è quando non hai forzato l'attaccante in uno scenario bruteforce. Dizionari / regole / permutazioni / attacchi combinati multi-parola sono estremamente efficienti nel trovare password non casuali.

    
risposta data 21.06.2012 - 16:39
fonte

Leggi altre domande sui tag