Domanda

Qual è il modo più veloce ma sicuro per crittografare le password in (preferibilmente PHP) e, qualunque sia il metodo scelto, è portatile?

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

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

È stato utile?

Soluzione

Se stai scegliendo un metodo di crittografia per il tuo sistema di accesso, la velocità non è tua amica, Jeff ha avuto un scambio di battute con Thomas Ptacek sulle password e sul conclusione era che dovresti usare il metodo di crittografia più lento e sicuro che ti puoi permettere.

Dal blog di Thomas Ptacek:
La velocità è esattamente ciò che non desideri in una funzione di hash della password.

I moderni schemi di password vengono attaccati con cracker di password incrementali.

I cracker incrementali non calcolano in anticipo tutte le possibili password violate.Considerano ogni hash della password individualmente e alimentano il loro dizionario attraverso la funzione hash della password nello stesso modo in cui farebbe la tua pagina di accesso PHP.I cracker da tavolo arcobaleno come Ophcrack utilizzano lo spazio per attaccare le password;cracker incrementali come John the Ripper, Crack e LC5 funzionano con il tempo:statistica e calcolo.

Il punteggio del gioco di attacco con password viene calcolato nel tempo impiegato per decifrare la password X.Con i tavoli arcobaleno, il tempo dipende da quanto deve essere grande il tuo tavolo e dalla velocità con cui puoi cercarlo.Con i cracker incrementali, il tempo dipende dalla velocità con cui è possibile eseguire la funzione di hash della password.

Quanto meglio riesci a ottimizzare la funzione di hash della password, tanto più veloce diventa la funzione di hash della password, tanto più debole sarà il tuo schema.MD5 e SHA1, anche i codici a blocchi convenzionali come DES, sono progettati per essere veloci.MD5, SHA1 e DES sono hash delle password deboli.Sulle CPU moderne, gli elementi costitutivi della crittografia grezza come DES e MD5 possono essere suddivisi in bit, vettorizzati e parallelizzati per rendere le ricerche delle password estremamente veloci.Le implementazioni FPGA game-over costano solo centinaia di dollari.

Altri suggerimenti

Sono con Pietro.Lo sviluppatore non sembra comprendere le password.Scegliamo tutti (e sono colpevole anche di questo) MD5 o SHA1 perché sono veloci.A pensarci bene (perché qualcuno me lo ha fatto notare di recente) non ha alcun senso.Dovremmo scegliere un algoritmo di hashing che è stupidamente lento.Voglio dire, sulla scala delle cose, un sito occupato effettuerà l'hashing delle password, cosa?ogni 1/2 minuto?A chi importa se ci vogliono 0,8 secondi contro 0,03 secondi dal punto di vista del server?Ma quella lentezza extra è enorme per prevenire tutti i tipi di comuni attacchi di forza bruta.

Dalla mia lettura, bcrypt è specificamente progettato per l'hashing sicuro delle password.È basato su Blowfish e ci sono molte implementazioni.

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

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

Va sottolineato che non vuoi crittografare la password, se vuoi hash Esso.

Le password crittografate possono essere decrittografate, consentendo a qualcuno di vederle.L'hashing è un'operazione unidirezionale, pertanto la password originale dell'utente viene eliminata (crittograficamente).


Per quanto riguarda l'algoritmo da scegliere, utilizza quello standard attualmente accettato:

  • SHA-256

E quando esegui l'hashing della password dell'utente, assicurati di aggiungere anche qualche altra spazzatura.per esempio.:

  • parola d'ordine: password1
  • sale: PasswordSaltDesignedForThisQuestion

Aggiungi il sale alla password dell'utente:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

Qualunque cosa tu faccia, non scrivere il tuo algoritmo di crittografia.Fare questo quasi garantirà (a meno che tu non sia un crittografo) che ci sarà un difetto nell'algoritmo che lo renderà banale da decifrare.

Considera l'uso bcrypt è utilizzato in molti framework moderni come laravel.

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

Non deve essere il PIÙ sicuro, non sto programmando per una banca (in questo momento) ma certamente NON LO FARA' memorizzare le password come testo semplice.

password_hash ( string $password , int $algo [, array $options ] ).(PHP 5 >= 5.5.0, PHP 7)

password_hash() crea un nuovo hash della password utilizzando un potente algoritmo di hashing unidirezionale.password_hash() è compatibile con crypt().Pertanto, gli hash delle password creati da crypt() possono essere utilizzati con password_hash().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top