Nozioni di base
L'approccio di base è Hash(secret | salt)
, che viene memorizzato insieme al sale. Ovviamente è importante usare un moderno algoritmo di hash come una delle varianti SHA2 (anche se attualmente SHA1 non è completamente rotto come è MD5). Nota che se stai memorizzando domande di sfida in questo modo, probabilmente vuoi Trim()
e ToLower()
il segreto prima di cancellarlo. Ciò potrebbe ridurre un po 'la complessità, ma le domande di sicurezza non sono intese ad avere un'alta entropia come una password comunque.
Che dire degli attacchi a forza bruta come i tavoli Rainbow?
Le preoccupazioni sugli attacchi di forza bruta possono essere mitigate in due modi:
- Richiede una quantità minima di entropia nel segreto (lunghezza, complessità, ecc.).
- Aumenta la quantità di calcolo richiesta per eseguire l'hash.
Il metodo utilizzato in bcrypt
è un buon miglioramento dell'hash standard perché aumenta la quantità di tempo per calcolare l'hash di molti ordini di grandezza. Fondamentalmente, ha cancellato il segreto molte volte in modo iterativo: Hash(Hash(...Hash(secret | salt)...))
Poiché la quantità di tempo è ancora relativamente piccola (centinaia di millisecondi), non aggiunge un ritardo intollerabile all'utente legittimo. Ma può rovinare gli attacchi automatici a forza bruta.
Non è abbastanza buono
Se la difficoltà aggiuntiva di bcrypt
è insufficiente, prova scrypt
. Funziona come bcrypt
ma deve salvare ogni hash iterativo in memoria per un'ultima unione alla fine. Questo aggiunge la stessa complessità temporale di bcrypt
ma aumenta anche la complessità dello spazio, rendendo più difficile l'implementazione nell'hardware, specialmente in parallelo.
Attuazione
Onestamente, non sono a conoscenza di una libreria C # per implementare questo, per non parlare di una "certificazione" di qualche ente ufficiale, ma non sarebbe troppo difficile. Supponendo che tu scriva codice thread-safe e la verifica della password avvenga su un sistema fidato come un server, problemi di implementazione come attacchi di canale laterale sono ridotti al minimo.
Ulteriori letture: Questa risposta a BCrypt è un buon algoritmo di crittografia da utilizzare in C #? Dove posso trovarlo?