Se la rete bitcoin stava crackando bcrypt, quale fattore di costo useresti?

6

Poiché il migliore esempio di risorsa raggruppata per crack hash è la rete bitcoin, che attualmente sfonda 2.14 ExaHashes / s.

Voglio chiedere, se le risorse di questa rete fossero indirizzate verso crackfish blowfish e (per estensione) bcrypt, quale sarebbe il fattore di costo minimo da mantenere quando si proteggono le password usando bcrypt?

    
posta Amin Shah Gilani 04.12.2016 - 16:44
fonte

2 risposte

5

Risposta breve: se confronti le velocità su x86, il costo massimo in PHP di 31 (2 ^ 31 iterazioni) sarebbe abbastanza sicuro per una password strong (casuale a 8 caratteri) . Non che sia utilizzabile, un hash richiederebbe circa 200 ore per generare su un desktop.

Risposta lunga: (ampio margine di errore a causa della mancanza di precisi dati sulle prestazioni hash, nessuna specificità sulla forza della password e approssimazione approssimativa.)

Il costo della forza bruta grezza può variare con un fattore di miliardi tra una password di 6 lettere e una password di lunghezza 10 con numeri e caratteri speciali. (26 ^ 6 = 3.0E + 8 per lettere minuscole, 94 ^ 10 = 5.3e + 19 per mixalpha-num-all) Le velocità di hash possono variare con l'implementazione.

Quindi, se l'utente sceglie una delle 1000 password più comunemente utilizzate, è valida come un numero di pin di 3 cifre, rendendo la domanda praticamente irrilevante.

A tal fine, la risposta è "il più possibile, non possiamo salvare tutti da soli"

Ma facciamo un calcolo del back-of-the-napkin per avere un'idea. Supponiamo che il database imponga un requisito minimo strong di "8 caratteri casuali"

Con un set di caratteri di tutti i caratteri ASCII maiuscoli e minuscoli, tutte le cifre e i caratteri speciali che verrebbero alle combinazioni 6161234432565770

Ora facciamo un'idea delle prestazioni degli hash. L'unico confronto side-by side che ho trovato è stato il seguente: link

Si afferma che il fattore di lavoro predefinito di 10 è circa pari a 80.000 cicli di SHA512crypt . Ora SHA 512 costa solo circa il 120% delle volte che richiede 256

Quindi ciò rende bcrypt con costo (10) approssimativamente uguale a 100.000 round di SHA256.

Il costo di BCrypt è definito in questo modo:

The two digit cost parameter is the base-2 logarithm of the iteration count for the underlying Blowfish-based hashing algorithm and must be in range 04-31, values outside this range will cause crypt() to fail

costo (10) = 2 ^ 10 = 1024 iterazioni. l'algoritmo di bitcoin SHA256 è circa 100 volte più veloce per iterazione. Supponendo che la rete BitCoins possa fare 2.14E + 18 SHA256 / secondo, verrebbe giù a 2.14E + 16 iterazioni di BCrypt / secondo. Lo spazio chiave della lunghezza-8 password casuale in charset mixalpha-numeric-all è circa 6.16E + 16

  • Quindi a 1 iterazione, potrebbe aggiungere una password simile a < 3s. il minimo per PHP è un costo di 4, quindi 16 iterazioni.
  • Al costo predefinito di 10, ci vorrebbe quasi un'ora.
  • Al costo massimo di 31 aumenterebbe un altro 2 ^ 21 = 2097152. Sarebbe arrivato a > 200 anni. (2097152 ore è un po 'meno di 240 anni. )

Questa è una forza bruta abbastanza irrealizzabile, e per il momento potrebbe essere considerata sicura.

La quantità massima di "costo" in BCrypt sarebbe sufficiente per l'intera rete BitCoin corrente se la password è moderatamente strong.

Tuttavia, il confronto tra BCrypt e SHA512 menziona il costo (20) richiede già > 3 minuti su una workstation, per cui costi così grandi non sono fattibili per ora. estrapolando 2 ^ 12 * 3.12 / 60 = ~ 213 ore

    
risposta data 04.12.2016 - 19:57
fonte
2

Forse stai facendo la domanda sbagliata:

Non vuoi chiedere a quale fattore di lavoro (numero di iterazioni) uso? (con KDF / hashing adattivo), vuoi chiedere a per quanto tempo un singolo hash prendere? e calcolare il fattore di lavoro da quello.

La risposta a quest'ultimo è "finché puoi tollerare". Altro qui da un esperto link

Quindi per rispondere alla tua domanda è necessario conoscere l'ora in cui la suddetta rete impiegherà per calcolare un hash. O più utile, l'H / s per un dato fattore di lavoro. I benchmark di Bcrypt sono spesso citati in termini di bcrypt(5) che è un fattore di lavoro di 5. Se è possibile ottenere l'H / s per bcrypt (5) di detta rete, allora si dispone di una base da confrontare con benchmark alternativi di cracking.

Il meglio che ho trovato per un dispositivo on-premise è questo 8x GTX Titan X benchmark cudaHashcat che si spaccherà bcrypt (5) ad una velocità di 133 KH / s (al momento della scrittura). Questa è una buona base da confrontare con una rete di cracking distribuita.

Solo una nota, hash cracking distribuito è non nuovo e dovremmo dare per scontato che i poteri di cui disporranno avranno molti ordini di grandezza più potere di cracking di qualsiasi altra cosa pubblicamente disponibile.

Stai chiedendo quale fattore di lavoro utilizzare per mantenere una password sicura?

Ecco la mia regola personale:

Benchmark your bcrypt on a local dev machine and a web server node that your app will be deployed into. Then choose the longest tolerable (in terms of UX) time you are willing to subject your users to. For me this is about 1000ms (remember: signup and login screens; doesn't happen often). Then find the work factor which sits just inside that time and select the slowest of your local dev and prod box.

    
risposta data 06.12.2016 - 04:22
fonte

Leggi altre domande sui tag