2010-05-11 21 views
7

Il mio prossimo compito sarà criptare le password. Sto lavorando al livello di accesso al database e il mio collega ha fatto questa richiesta: implementare un hash SHA-512 su un metodo vuoto. Come posso fare questo?Come cancellare una password?

+16

No. Lasciare la crittografia della password agli esperti di sicurezza. Lo farai male, e allora metteresti in pericolo la tua organizzazione. Assumere un esperto; questo è molto più economico del costo di ripulire il caos dopo un attacco riuscito contro i punti deboli che non sapevi di aggiungere al tuo sistema di sicurezza. –

+4

L'assunzione di un esperto dipende dal livello di rischio. Se stai memorizzando informazioni private per le masse e questa password è tutto ciò che sta in mezzo, sì, cerca un esperto. La maggior parte degli esempi elencati di seguito è sufficiente per il tuo progetto di informazione non riservata media. –

+1

@Eric - Suppongo che tu intenda con questo "utilizzare l'implementazione di SHA512 in .NET invece di crearne uno", non "utilizzare i provider di appartenenza implementati in .NET per la tua sicurezza". Posso vedere una certa validità per entrambi, ma mentre sono d'accordo al 100% con il primo, posso vedere alcune situazioni in cui quest'ultimo non è realmente possibile. In effetti, non mi è mai venuto in mente che qualcuno avrebbe preso in considerazione l'implementazione della propria versione di SHA-512 - quindi il tuo commento mi ha sorpreso per un minuto sul fatto che volevi dire che avrei dovuto estendere la sicurezza nelle mie app a qualcuno più qualificato. :-) – tvanfosson

risposta

10

Piuttosto un semplice processo davvero:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

using(SHA512 sha512 = new SHA512Managed()) 
{ 
    byte[] hash = sha512.ComputeHash(data); // Add Per User Salt as per the Below 
} 

hash ora contiene un hash non reversibile dei dati iniziale che si voleva hash. Inoltre, controlla MSDN. Alcune note: (. Più lungo è il migliore, e unico per ogni utente - Grazie Paul, buon punto)

  • utilizzare sempre un salt
  • SHA2 generazione * (e SHA in generale) i metodi hash sono costruiti per la velocità , quindi non sono insicuri, ma non sono i più sicuri. Guarda bcrypt e SLaks ha mentioned.
+0

Qualche parola sul downvote? Grazie. –

+2

+1 da parte mia, anche se sarebbe opportuno menzionare che il sale dovrebbe essere univoco per password. E forse cambiando il tuo esempio per includere il sale – PaulG

+0

@Paul - Buon punto, aggiunto. –

1

SHA512 Class

C# esempio da quella pagina:

byte[] data = new byte[DATA_SIZE]; 
byte[] result; 
SHA512 shaM = new SHA512Managed(); 
result = shaM.ComputeHash(data); 
+0

-1 per l'utilizzo del semplice SHA-512, che è veloce. Utilizzare una funzione di derivazione a chiave lenta, come PBKDF2, bcrypt o scrypt. – CodesInChaos

10

Si dovrebbe usare bcrypt, che è più sicuro per le password di SHA512.

Se è davvero necessario utilizzare SHA512, è necessario utilizzare lo SHA512Managed class, come indicato da altre risposte.
Assicurati di salare il tuo hash.

+2

interessante, non visto prima dello – Pharabus

+0

non salate il testo in chiaro prima dell'hashing? –

+0

@uncle brad: Questo è ciò che intendevo. – SLaks

7

come hash una password?

Con un sale. Veramente.

Mai

, mai fare questo:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

Ma questo:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample + salt); 

Questo è uno dei più frainteso "trucco del mestiere". La maggior parte delle persone non sa che cos'è un "sale" e quando lo spieghi a loro, pensano che sia inutile.

La verità è: SHA-512 o MD5 o un hash molto debole, una volta che le tabelle arcobaleno sono precalcolate, non fa alcuna differenza. SHA-65536, se dovesse esistere (sono fasullo qui), non sarebbe migliore di qualsiasi altro algoritmo di hash una volta che le tabelle arcobaleno sono precalcolate.

Un grande abbastanza "sale" rende impossibile tabelle arcobaleno:

http://en.wikipedia.org/wiki/Rainbow_table

Nota che, anche se si comprende appieno come hash, tavoli sale e arcobaleno si riferiscono (e quindi capire perché l'articolo afferma Wikipedia: "Un sale viene spesso impiegato con password hash per rendere questo attacco più difficile, spesso impossibile".) c'è una probabilità molto alta che i tuoi colleghi non lo facciano. Proprio come è molto probabile che la maggior parte delle persone up e downvoting in questo thread non capiscano questo argomento.

Ho visto le risposte qui su SO con 30 upvotes in cui qualcuno che non riusciva a capire che cos'aveva un salino veniva con le parole techno per difendere la sua posizione ... Eppure aveva tutti questi upvotes (troppo pigro per trovare la domanda ma era epico).

+1

E dovresti usare 'RNGCryptoServiceProvider' per creare il tuo sale per ogni nuovo hash, e memorizzare sia l'hash che il sale. – Will

+0

Un sale da solo non è sufficiente. Anche la funzione di hash dovrebbe essere lenta. Usa PBKDF2, bcrypt o scrypt. – CodesInChaos

Problemi correlati