Innanzitutto, alcuni termini importanti:
Hashing - L'atto di prendere una stringa e produrre una sequenza di caratteri che non può essere ripristinata alla stringa originale.
Crittografia simmetrica - (di solito chiamata semplicemente "crittografia"): l'atto di prendere una stringa e produrre una sequenza di caratteri che può essere decrittografata nella stringa originale attraverso l'uso della stessa chiave di crittografia che l'ha crittografata.
Rainbow Table : una tabella di ricerca che contiene tutte le varianti di caratteri con hash in un algoritmo di hashing specifico.
Salt : una stringa casuale nota aggiunta alla stringa originale prima che venga hash.
Per .NET Framework, Bcrypt non ha ancora un'implementazione di riferimento verificata . Questo è importante perché non c'è modo di sapere se ci sono gravi difetti in un'implementazione esistente. Puoi ottenere un'implementazione di BCrypt per .NET qui . Non so abbastanza sulla crittografia per dire se si tratta di un'implementazione buona o cattiva. La crittografia è un campo molto profondo. Non tentare di creare il tuo algoritmo di crittografia . Sul serio.
Se hai intenzione di implementare la tua sicurezza della password (sospiro), allora devi fare diverse cose:
- Utilizzare un algoritmo hash relativamente sicuro .
- Saltare ogni password prima che venga l'hash.
- Utilizzare un sale unico e lungo per ogni password e archiviare il sale con la password.
- Richiedi password complesse .
Sfortunatamente, anche se fai tutto questo, un determinato hacker potrebbe ancora potenzialmente scoprire le password, ci vorrebbe solo molto tempo. Questo è il tuo principale nemico: il tempo .
L' algoritmo bcrypt funziona perché impiega cinque ordini di grandezza in più per eseguire l'hashing di una password rispetto a MD5 ; (e ancora molto più lungo di AES o SHA-512). Obbliga l'hacker a dedicare molto più tempo alla creazione di una tabella arcobaleno per la ricerca delle password, rendendo molto meno probabile che le password siano a rischio di essere violate.
Se stai salando e cancellando le tue password, e ogni sale è diverso, un potenziale hacker dovrebbe creare una tabella arcobaleno per ogni variante di sale , solo per avere una tabella arcobaleno per una password salata + con hash. Ciò significa che se hai 1 milione di utenti, un hacker deve generare 1 milione di tabelle arcobaleno. Se stai usando lo stesso sale per ogni utente, l'hacker deve solo generare 1 tabella arcobaleno per hackerare con successo il tuo sistema.
Se non stai salando le tue password, tutto ciò che un utente malintenzionato deve fare è estrarre una tabella Rainbow esistente per ogni implementazione (AES, SHA-512, MD5) e vedere se una corrisponde all'hash. Questo è già stato fatto , un attaccante non ha bisogno di calcolare da soli queste tabelle Rainbow .
Anche con tutto ciò, devi usare buone pratiche di sicurezza . Se riescono a utilizzare correttamente un altro vettore di attacco (XSS, SQL Injection, CSRF, ecc. ) Sul tuo sito, la buona sicurezza della password non ha importanza. Sembra un'affermazione controversa, ma pensaci: se riesco a ottenere tutte le tue informazioni utente attraverso un attacco di iniezione SQL o posso convincere i tuoi utenti a fornirmi i loro cookie tramite XSS, non importa quanto sia buona la tua password la sicurezza è .
Altre risorse:
- Jeff Atwood: .NET Encryption Simplified (ottimo per una panoramica dell'hash)
- Jeff Atwood: Ho appena effettuato l'accesso come te
- Jeff Atwood: Probabilmente stai memorizzando le password in modo errato
- Jeff Atwood: Speed Hashing
Nota: si prega di raccomandare altre buone risorse. Devo aver letto una dozzina di articoli di dozzine di autori, ma pochi scrivono chiaramente sull'argomento come fa Jeff. Modifica gli articoli quando li trovi.