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:
- Abbastanza facile per me.
- 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:
- Quanto vale una coppia nome utente / password generica.
- 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.