sto lavorando su una funzionalità di crittografia basata su classi ereditate da SymmetricAlgorithm quali TripleDES, DES, eccPasswordDeriveBytes vs Rfc2898DeriveBytes, obsoleto, ma il modo più veloce
Fondamentalmente Ci sono due opzioni per generare chiave coerente e IV la mia classe algoritmica, PasswordDeriveBytes
e Rfc2898DeriveBytes
, entrambi ereditano dalla classe astratta DeriveBytes.
Il metodo PasswordDeriveBytes.GetBytes()
è contrassegnato come obsoleto in .NET framework mentre è consigliato Rfc2898DeriveBytes.GetBytes(), poiché corrisponde allo standard PBKDF2. Tuttavia, in base ai miei test, la chiamata allo stesso metodo GetBytes()
nella classe Rfc2898DeriveBytes è quasi 15 volte più lenta di quella nella classe PasswordDeriveBytes
, che comporta un utilizzo imprevisto della CPU (sempre superiore al 50%).
Here're alcuni dati di test:
- Iterations: 100
- Tipo Algoritmo: DES
- Testo originale: "Sono una chiave di prova, mi crittografare favore"
- Tempo:
- PasswordDeriveBytes: 99ms
- Rfc2898DeriveBytes: 1,373ms
Sulla base del test, i risultati negativi Rfc2898DeriveBytes
non è accettabile in ambiente di produzione.
Qualcuno ha notato questo problema prima? Qualche soluzione posso ancora usare uno standard senza colpire le prestazioni? Qualche rischio di utilizzare un metodo obsoleto (potrebbe essere rimosso nella versione futura)?
Grazie ragazzi!
Edit:
Probabilmente ho trovato dove il problema è ... Il numero di conteggio di default iterazione per PasswordDeriveBytes
è 100, mentre per Rfc2898DeriveBytes
è 1000. Dopo li ho cambiato allo stesso numero nel 1000, l'esecuzione Rfc2898DeriveBytes
è solo doppio tempo.
Con quale frequenza si stanno derivando le chiavi in un ambiente di produzione? E, per quanto riguarda i tuoi dati di tempistica, quando hai detto "100 iterazioni" - sono le iterazioni sul tasto onee, o hai generato 100 chiavi. Qualsiasi dato perf basato su 100 prove è sospetto, ma penso che tu abbia effettivamente provato UNA prova. Come in tutti i casi di analisi perf, non è appropriato trarre conclusioni sulle prestazioni del server in base al tempo di risposta di una singola prova. – Cheeso
@Cheeso Il test era solo un test unitario delle prestazioni per queste due classi e non è stato eseguito in un'app reale. Le "100 iterazioni" che ho citato sono state un po 'confuse, questo significa solo che ho eseguito ognuna di esse 100 volte. Non è un vero test di perf, ma solo un confronto. – tshao
Penso che potresti aver perso il punto in cui 'Rfc2898DeriveBytes' è fondamentalmente _designed_ essere lento cosicché i controlli hash delle password (eseguiti per log-in e quindi abbastanza rari) non si accorgano del colpo sulle prestazioni mentre gli attacchi brute force fanno. Se hai bisogno di generare un sacco di hash 'Rfc2898DeriveBytes' non fa per te, ma se hai bisogno di sicurezza dagli attacchi brute force lo è. – Keith