Qual è l'algoritmo consigliato per creare una chiave da una password?

2

Nella mia nuova utility di crittografia dei documenti segreti, la chiave per la crittografia simmetrica = l'hash di un salt casuale e una password fornita dall'utente.

È necessario avere una lenta funzione hash per prevenire la forza bruta su password non ottimali. MD5 e SHA1 si sono dimostrati immensamente veloci, quindi ovviamente non è abbastanza. Inoltre, non ho grandi speranze per SHA256.

Una delle opzioni è ripetere l'operazione di hashing un numero assurdo di volte. A causa della vasta ripetizione necessaria (minimo 100 k ), ero un po 'preoccupato per gli attaccanti che saprebbero un modo per saltare avanti con scorciatoie, magari usando la tabella rho, o qualche altro mezzo.

Questo suono da approccio di 100.000 rehash o dovrei usare qualche altro algoritmo per creare una chiave da una password e salt?

Ovviamente posso anche richiedere una password più complessa, ma penso che un buon obiettivo sarebbe quello di supportare la variazione di 6 lettere, non dizionario, anche se richiedo un intero secondo di rehashing per eseguire lo sblocco. Questo è un obiettivo accettabile e ritengo sia meglio consentire password più brevi se a) è ciò che l'utente desidera eb) non ha alcun impatto sulla sicurezza in modo significativo.

1. Una stima della durata dell'hash per un processore di < 2 Ghz è 1 millisecondo per ogni 1-2000 ripetizioni (a seconda dell'algoritmo). Per le password di 6 lettere non dizionario che devono essere conservate per 1 anno, avremmo bisogno della generazione della chiave per utilizzare almeno 100 millisecondi .

    
posta George Bailey 27.02.2012 - 17:58
fonte

3 risposte

5

Alcune delle opzioni più popolari sono PBKDF2, bcrypt e scrypt. Una risposta correlata ha molte buone informazioni. L'essenza è bcrypt è meglio di PBKDF2, ma o andrebbe bene e sicuro. lo scrypt sembra promettente, ma è piuttosto nuovo e, nel mondo della crittografia, spesso viene utilizzato come metodo di prova, a meno che non sia assolutamente necessario. Vedere la risposta a cui mi sono collegato per gli attacchi rispetto ai quali lo scrypt è migliore di bcrypt.

    
risposta data 27.02.2012 - 18:13
fonte
3

Ti consiglio di usare PBKDF2. È progettato esattamente per questo scopo: derivare una chiave crittografica da una password. È possibile sintonizzare PBKDF2, per fare in modo che la chiave crittografica richieda esattamente il tempo che si desidera (maggiore = più sicuro, ma troppo lungo = non conveniente). È possibile memorizzare il sale in chiaro insieme al testo cifrato.

Non penso di raccomandare l'uso di bcrypt o scrypt. Sono progettati per password di hashing. Mentre bcrypt o scrypt certamente potrebbe costituire la base per una soluzione ragionevole, non sono direttamente adatti e potrebbe essere necessario apportare alcune modifiche ( attentamente ), quindi sarà probabilmente sarà più semplice usare tranquillamente PBKDF2.

Non mi preoccuperei di xor-ing bcrypt e PBKDF2. PBKDF2 va bene da solo; non c'è bisogno di farlo xor altro.

    
risposta data 28.02.2012 - 22:17
fonte
2

Su una nota a parte, voglio avvisarti dei problemi di sicurezza con l'utilizzo di passphrase brevi per derivare chiavi crittografiche.

Si menziona un'ipotetica "password di 6 lettere, non dizionario". Bene, ecco una nota di cautela a riguardo. La maggior parte delle password di 6 lettere non ha nulla vicino alla forza di una raccolta casuale di 6 lettere; la maggior parte delle password di 6 lettere ha una buona struttura. E semplicemente dire agli utenti "non usare una parola del dizionario" non è sufficiente per cambiarlo.

Voglio anche avvertirti della possibilità di parallelizzazione. Si dice che una "password di 6 lettere, non dizionario" dovrebbe "contenere per 1 anno" se la generazione della chiave richiede almeno 100 millisecondi. Bene, penso che quello che intendi è che se non c'è una struttura nella password, allora la rottura della chiave crittografica richiederà almeno 1 anno CPU. C'è una grande differenza tra 1 anno di CPU e 1 anno. Qualcuno che ottiene 100 macchine potrebbe crackare la password in pochi giorni. Questo è un livello di sicurezza piuttosto basso, nel mondo odierno delle botnet, dell'EC2 e del cloud computing. E questo presuppone già che i tuoi utenti sceglieranno password in 6 lettere perfettamente casuali - un presupposto che sappiamo essere totalmente false.

Per questi motivi, le password scelte dall'utente non sono generalmente una buona base per una chiave crittografica. È probabile che una parte sostanziale delle password scelte dall'utente sia irrinunciabile tramite attacchi a forza bruta, anche se si utilizza PBKDF2. Pertanto, potresti considerare seriamente che altro puoi fare, oltre a PBKDF2, per proteggere i tuoi utenti.

Una possibilità potrebbe essere quella di generare una passphrase suggerita a caso per l'utente (ad esempio, cinque parole scelte a caso da un dizionario di 4096 parole, o dieci caratteri scelti a caso da a-zA-Z0-9), e renderlo facile per l'utente utilizzare il tuo suggerimento. Un altro metodo potrebbe essere quello di testare la qualità della passphrase dell'utente e, se sembra scadente, avvisare l'utente che la sua passphrase è probabilmente insicura e magari fornire un'alternativa raccomandata (ad esempio, utilizzare la seguente passphrase suggerita). Un altro metodo è utilizzare la crittografia a chiave pubblica, ma automatizzare il processo in modo che l'utente non debba essere a conoscenza di ciò che sta accadendo. Ci sono probabilmente molte altre possibilità creative che potresti prendere in considerazione, a seconda dei dettagli del tuo specifico dominio applicativo.

    
risposta data 28.02.2012 - 22:30
fonte

Leggi altre domande sui tag