hashing della password a livello aziendale

2

Ho bisogno di creare alcune classi di hashing (C #) per un servizio di login in cui (sfortunatamente) le password devono essere archiviate nel database del server SQL. In passato ho utilizzato BCrypt o PBKDF2 ma ci sono alcune preoccupazioni. Questo è per una soluzione di livello enterprise in esecuzione negli Stati Uniti. Vedo 3 percorsi validi su cui vorrei che tu commentassi.

BCrypt: non è uno standard NIST e probabilmente sarebbe richiesto per alcuni clienti. Sono anche riluttante a utilizzare BCrypt per i software di livello enterprise perché ho bisogno di qualcosa che sia supportato da una grande azienda o da alcuni sviluppatori dedicati. Tutto quello che posso trovare sono alcune (vecchie) implementazioni che vengono mantenute da un ragazzo nel suo tempo libero. Questo non dovrebbe causare qualche preoccupazione? Intendo che mentre l'algo stesso è grande, l'implementazione potrebbe non esserlo. E sicuramente deve essere mantenuto.

Quali sono le raccomandazioni per l'iterazione del 2016 (fattore di lavoro) - 12?

PBKDF2: l'unica soluzione che riesco a trovare per C # è Microsofts "PasswordHasher" (o simile implementazione Rfc2898DeriveBytes). La versione rilasciata utilizza HMAC SHA1 con 1000 iterazioni. Ciò sembra non valido nel 2016. Esiste una versione più recente qui , ma sembra essere un prerelease in Nuget. In ogni caso è anche solo usando HMAC SHA256 con un conteggio di iterazione statico di 10000. Dove mi aspetto che questo sia almeno 256000 nel 2016. Inoltre, se si guarda al codice, l'implementazione chiama alcuni Win8Pbkdf2Provider dietro le quinte che tendono ad essere Derivato da BCrypt (rendendo comunque necessario il mio requisito NIST)

SHA1 + AES: Un approccio alternativo sarebbe semplicemente andare con Rfc2898DeriveBytes standard utilizzando HMAC SHA1 e quindi utilizzando AES per crittografare i valori del database - memorizzando la chiave AES sul disco. Mi piace molto questo approccio in realtà ma se cerchi queste cose, quella soluzione non emerge mai, quindi potrei essermi perso qualcosa ...

Che cosa raccomandi? Che cosa fai quando cerchi di proteggere il software a livello aziendale?

    
posta Werner 05.09.2016 - 11:05
fonte

2 risposte

3

Quali sono i tuoi requisiti effettivi? "Enterprise level" non dice molto, almeno non più di sarà un grande progetto . Se il NIST è un requisito, allora PBKDF2 è tutto ciò che hai. Dal punto di vista della sicurezza, consiglierei bcrypt, poiché è leggermente più sicuro di PBKDF2 che è basato su varianti SHA. bcrypt stesso ha funzionato abbastanza a lungo da essere un'alternativa buona a PBKDF2, anche se il NIST non dice nulla (ancora).

Quando si tratta di implementazione, dovresti davvero usare una libreria ben consolidata. Non si desidera controllare manualmente i dettagli dell'implementazione e nessuno dei due deve farlo. Una rapida ricerca ha rivelato che esistono diverse implementazioni di bcrypt per C # ben supportate nella comunità C #.

Per maggiori dettagli su PBKDF2 vs bcrypt vedi anche la risposta di Thomas Pornin.

Aggiorna

Non andrei con l'opzione SHA1 + AES. Fare ciò non risolverà il problema, ma attenuerà solo i rischi per determinati tipi di attacchi. Tuttavia, se l'applicazione in qualche modo dovesse perdere i contenuti del database, è possibile affidarsi solo a SHA1. Mi sembra un hack e l'ultima cosa che vuoi è cucinare qualcosa da te.

    
risposta data 05.09.2016 - 11:27
fonte
2

Non vedo alcun motivo per non utilizzare BCrypt, esiste una libreria decente chiamata BCrypt.Net .

La sicurezza proviene dall'algoritmo, non dall'implementazione, quindi puoi ricontrollare il risultato direttamente con altre librerie conosciute. Ciò che può andare storto è la generazione di un sale casuale sicuro. Se si guarda però il codice sorgente, si può vedere che usano il generatore di numeri casuali crittografico dalla libreria DotNet, quindi questo è fatto correttamente.

    
risposta data 05.09.2016 - 13:49
fonte

Leggi altre domande sui tag