Rfc2898DeriveBytes utilizzando HMAC SHA1 è ancora considerato "abbastanza sicuro" per le password di hashing?

20

Mi è stato detto da un CISSP che la classe .NET Rfc2898DeriveBytes non avrebbe superato un controllo di sicurezza oggi perché usa ancora SHA1. La dipendenza da SHA1 - anche con le iterazioni - lo rende troppo vulnerabile al cracking a forza bruta. Per la mia comprensione e per chiunque altro si imbatta in questa domanda, Rfc2898DeriveBytes è ancora considerato un metodo sicuro per le password di hashing? Sulla stessa falsariga, HMAC SHA256 ha un sale ma nessuna iterazione è sufficiente?

Per la cronaca, dal momento che mi è stato richiesto di utilizzare qualsiasi cosa diversa da Rfc2898DeriveBytes e dal momento che so meglio di creare il mio da zero, intendo smontare Rfc2898DeriveBytes e duplicare il codice usando SHA256 invece di SHA1.

    
posta TheOtherTimDuncan 08.07.2015 - 20:03
fonte

1 risposta

22

Rfc2898DeriveBytes strumenti l'algoritmo standard noto come PBKDF2 e definito in RFC 2898 (da cui il nome). Tale algoritmo utilizza una funzione pseudocasuale sottostante configurabile, che di solito è HMAC , e HMAC si basa su una funzione di hash sottostante configurabile , di solito SHA-1. Benché tutto ciò sia configurabile, una determinata implementazione potrebbe non essere flessibile e, infatti, Rfc2898DeriveBytes sempre utilizza HMAC e sempre usa SHA-1 come funzione sottostante per SHA-1.

Al giorno d'oggi, le persone conosciute collettivamente come "auditor" tendono a piangere, lamentarsi, urlare, deridere e correre in cerchio quando vedono qualcosa che coinvolge SHA-1 . Questo è scientificamente ingiustificato. In questo momento , tra tutte le Science pubblicate, non c'è la minima indicazione che SHA-1 quando usato in HMAC sarebbe debole. I punti deboli noti di SHA-1 riguardano le collisioni che non hanno impatto sull'HMAC (e sono comunque teoriche). Se un ragazzo con un CISSP insiste sul fatto che SHA-1 rende effettivamente PBKDF2 più vulnerabile alla forza bruta, allora quel ragazzo dovrebbe andare a imparare di nuovo le sue lezioni.

Ciononostante, cambiare SHA-256 non è una cattiva idea, quindi se shA-1 è quello che serve per sbarazzarsi degli auditor, così sia.

Tuttavia, si deve ancora dire quanto segue:

  • Disassemblare e modificare è un metodo piuttosto grezzo e tende a portare a codice non gestibile. Potresti semplicemente iniziare dal codice sorgente attuale (ad esempio da qui ) o, ancora più semplicemente (e con uno stato giuridico più pulito), reimplementarlo da zero. .NET fornisce un'implementazione HMAC / SHA-256 ; utilizzarlo per fare un codice PBKDF2 non è difficile.

  • In alternativa, puoi provare a riutilizzare altre implementazioni esistenti, come questo .

  • Si usa PBKDF2 quando si desidera "hash una password" e non tutte le funzioni sono uguali a tale riguardo. Una funzione di hashing è valida solo nella misura in cui è costoso da calcolare per gli attaccanti. A tale riguardo, PBKDF2 con SHA-1 o SHA-256 non è la scelta migliore; discutibilmente, PBKDF2 con SHA-512 è un affare migliore (perché la GPU esistente ha un tempo di ottimizzazione più difficile di SHA-512 rispetto a SHA-256), ma altre soluzioni potrebbero essere preferibili, in particolare bcrypt . Per ulteriori informazioni su questo argomento, leggi questo e più in generale questo .

    Questo significa che mentre i "punti deboli" di SHA-1 non rendono più debole PBKDF2, è comunque una funzione che può essere ottimizzata molto bene su GPU, che è, in quel caso, un problema - ma, e questo è l'importante punta qui, SHA-256 non è migliore.

  • In ogni caso, utilizzando un'implementazione C # pura, si accetta che questo specifico per la CPU funzioni con il rallentamento intrinseco di tale tecnologia, che può essere stimato in un fattore da 2 a 3 se confrontato con l'ottimizzazione Codice C (o assemblaggio). In altre parole, dai un vantaggio di 2x o 3x agli attaccanti. Pertanto, potresti voler utilizzare un codice nativo qui, non puro C #.

risposta data 08.07.2015 - 21:01
fonte

Leggi altre domande sui tag