Implementazione di riferimento dell'hash e della verifica della password C #

7

Qualcuno ha un'implementazione di riferimento (idealmente certificata da terze parti, o approvata dal governo ) in modo un hash unidirezionale con una password per C # eo Java?

Idealmente, mi piacerebbe vedere qualcosa che includa una tecnica "sale e pepe" come menzionato qui così come ogni altro tecnica di sicurezza moderna per la convalida che potrebbe essere applicabile.

I contenuti che voglio proteggere sono informazioni che l'utente può ricordare, come una password, o la risposta a una domanda di sfida.

Se non si dispone di un esempio di codice completo, sarebbe utile una descrizione generale di quale algoritmo scegliere e metodi di esempio di salatura e peppering.

    
posta random65537 12.02.2011 - 18:29
fonte

3 risposte

5

Dato il tuo nuovo requisito "approvato dal governo", la mia ipotesi è che una buona soluzione sarebbe PBKDF2 da RFC 2898 . È implementato per .NET in Classe Rfc2898DeriveBytes (System.Security.Cryptography) . Probabilmente vuoi sostituire SHA-256 per SHA-1 lì dentro.

Ho anche appena imbattuto la password Hashed quasi sicura: fshp che è come PBKDF1 ma con SHA-256 di default. Supporta un numero variabile di iterazioni, per default a 4096. Usa 64 bit di sali. Hanno implementazioni per .NET, Python, Ruby, Perl, PHP5, Java e JavaScript.

Come descritto e discusso in .net impl di bcrypt - StackTranslate.it , sembra che per .NET / CLR un'altra buona opzione (sebbene non approvata dal NIST) è BCrypt.net:

e per Java una buona opzione è

Suppongo che nessuno dei due abbia il concetto di "pepe" o la complessità dello spazio di scrypt.

    
risposta data 13.02.2011 - 04:02
fonte
2

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:

  1. Richiede una quantità minima di entropia nel segreto (lunghezza, complessità, ecc.).
  2. 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?

    
risposta data 12.02.2011 - 19:57
fonte
1

.Net answer :
Secondo questo post tutto -Cng e < strong> -CryptoServiceProvider implementazioni postfixed dal Lo spazio dei nomi .Net Cryptography deve essere certificato FIPS, al contrario delle versioni gestite.

Svantaggi:

I vantaggi:

  • Sono certificati FIPS
  • Gli algoritmi di hashing utilizzano bcrypt
risposta data 29.08.2018 - 12:49
fonte

Leggi altre domande sui tag