2008-08-03 12 views
27

Qual è il modo più veloce e sicuro per crittografare le password in (PHP preferito) e per quale metodo si sceglie è portatile?Crittografia delle password

In altre parole, se successivamente migrerò il mio sito Web su un server diverso, le mie password continueranno a funzionare?

Il metodo che sto usando ora mi è stato detto dipende dalle esatte versioni delle librerie installate sul server.

risposta

29

Se si sceglie un metodo di crittografia per il proprio sistema di accesso, allora la velocità non è tua amica, Jeff ha avuto un po 'di fortuna con Thomas Ptacek sulle password e lo conclusion era che dovresti usare il metodo di crittografia più lento e sicuro puoi permetterti

dal blog di Thomas Ptacek:
velocità è esattamente ciò che non si vuole in una funzione di hash della password.

I moderni schemi di password vengono attaccati con password incrementali.

I cracker incrementali non calcolano tutte le password possibili. Considerano individualmente ogni hash della password e alimentano il loro dizionario tramite la funzione di hash della password allo stesso modo della pagina di accesso PHP. I cracker da tavolo arcobaleno come Ophcrack usano lo spazio per attaccare le password; cracker incrementali come John the Ripper, Crack e LC5 lavorano con il tempo: statistiche e calcoli.

Il gioco di attacco password è segnato nel tempo necessario per decifrare la password X. Con le tabelle arcobaleno, quel tempo dipende da quanto deve essere grande il tuo tavolo e quanto velocemente puoi cercarlo. Con i cracker incrementali, il tempo dipende dalla velocità con cui è possibile eseguire la funzione hash della password.

Quanto migliore è possibile ottimizzare la funzione di hash della password, quanto più veloce è la funzione di hash della password, tanto più debole è lo schema. MD5 e SHA1, anche i codici a blocchi convenzionali come DES, sono progettati per essere veloci. MD5, SHA1 e DES sono deboli hash delle password. Nelle moderne CPU, i blocchi di crittografia grezzi come DES e MD5 possono essere bitolti, vettorizzati e parallelizzati per velocizzare le ricerche di password. Le implementazioni di Game-over FPGA costano solo centinaia di dollari.

14

Sono con Peter. Gli sviluppatori non sembrano comprendere le password. Selezioniamo tutti (e anche io sono colpevole di questo) MD5 o SHA1 perché sono veloci. Pensandoci ('perché qualcuno me l'ha fatto notare di recente) non ha senso. Dovremmo scegliere un algoritmo di hashing così lento e stupido. Voglio dire, sulla scala delle cose, un sito occupato cancellerà le password? ogni 1/2 minuto? A chi importa se ci vogliono 0,8 secondi contro 0,03 secondi di server? Ma quella lentezza extra è enorme per prevenire tutti i tipi di attacchi brute-forzanti comuni.

Dalla mia lettura, bcrypt è specificamente progettato per l'hashing della password sicura. È basato su blowfish e ci sono molte implementazioni.

Per PHP, controlla PHPPass http://www.openwall.com/phpass/

per chiunque fare NET, controlla BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

2

Non sto necessariamente cercando il più veloce, ma un buon equilibrio, alcuni dei server che questo codice è stato sviluppato per essere abbastanza lento, lo script che hash e memorizza la password impiega 5-6 secondi per essere eseguito, e l'ho ridotto all'hashing (se commento l'hashing che esegue, in 1- 2 secondi).

Non deve essere il più sicuro, io non sono codding per una banca (in questo momento), ma certamente WILL NOT memorizzare le password come testo normale.

+0

Mentre questo è chiuso, si dovrebbero ancora le password hash il più sicuro possibile. Qual è il modo più semplice per ottenere la password di un conto in banca? Crea un fantastico sito Web in cui puoi iscrivere le persone. Molte persone useranno le password esistenti. Ora hai una lunga lista di password. Essere punto, il modo più rapido per ottenere le password di altre persone sarebbe quello di hackerare il sistema se sapessi che è stata una cattiva implementazione. –

8

Si deve rilevare che non si vuole cifrare la password, si desidera hash esso.

Le password crittografate possono essere decifrate, consentendo a qualcuno di vedere la password. L'hash è un'operazione a senso unico in modo che la password originale dell'utente sia stata eliminata (crittograficamente).


Quanto a quale algoritmo si dovrebbe scegliere - utilizzare il attualmente accettato standard di un:

  • SHA-256

E quando si hash della password dell'utente, essere sicuri di hash anche in qualche altra roba con esso. ad esempio:

  • password password1
  • sale: PasswordSaltDesignedForThisQuestion

aggiungere il sale per la password dell'utente:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
+4

-1 SHA-256 non è una funzione di hashing della password e non è sicuro per questo scopo. Può essere * parte di uno * (PBKDF2), ma è qualcosa di completamente diverso. Anche il tuo esempio è fuorviante, perché il sale non dovrebbe essere una frase intelligente, dovrebbe essere un valore casuale (per utente). –

7

Qualunque cosa tu faccia, non scrivere il proprio algoritmo di crittografia . Fare questo garantisce quasi (a meno che tu non sia un crittografo) che ci sarà un difetto nell'algoritmo che renderà banale il crack.

+0

Anche se sei un crittografo, probabilmente avrà un difetto: ci vorranno anni di revisione prima che un algoritmo diventi "popolare" –

+1

Questo è vero. E mi ricorda un analogo aneddoto di Don Knuth sulla falsariga di: molto tempo fa ha provato a scrivere un generatore di numeri casuali e ad accumulare tutte le operazioni più oscure che potesse immaginare. Alla fine ha gestito questa creazione monumentale e ha emesso il numero 4 indefinitamente. (I dettagli potrebbero essere stati modificati nella retelling.) – ndkrempel

2

Si consiglia di utilizzare bcrypt è utilizzato in molti framework moderni come laravel.