2012-07-09 1 views
6

Eventuali duplicati:
Secure hash and salt for PHP passwordsUso md5 assicurato anche la sua più difficile

ho visto qualcuno codifica di un hash della password come questo,

md5(uniqid(mt_rand('password', 15), true)); 

è che un modo sicuro per fare questo? è che ha funzionato?

+8

Come fanno a verificare la password una volta eseguita l'hash?Anche 'mt_rand' prende come parametri, non stringhe. –

+1

Ah, @Rocket che domanda ?? !!! – Engineer

+0

Personalmente uso [phpass] (http://www.openwall.com/phpass/). –

risposta

6

Non solo non è sicuro, non funziona nemmeno.

mt_rand accetta 2 parametri, un valore minimo e un valore massimo.

mt_rand('password', 15) 

Questo trasforma 'password' ad un int (0), quindi restituisce un numero casuale tra 0 e 15.

uniqid(mt_rand('password', 15), true) 

Questo genera un ID univoco, e antepone il numero casuale dal passaggio precedente ad esso: calcolare qualcosa di simile:

144ffb22886d58e1.82100749 

la stringa verrà poi md5'd.

Come si può vedere, questo codice è inutile al 100%. La password originale viene convertita in 0 e persa per sempre, quindi tutto quello che stai facendo è l'hashing di numeri casuali, che è inutile. Ora che hai il tuo hash, non c'è modo di verificarlo di nuovo. Poiché la password viene convertita, qualsiasi cosa entri dall'utente non ha importanza.

Quindi, no, questo codice non è sicuro, non usarlo.

Personalmente, io uso il phpass library. È sicuro e semplice da usare.

+0

Diciamo che se uso senza 'mt_rand()' come questo, 'md5 (uniqid ('passwrd', true));' è meglio? – itsme

+0

@itsme: il problema è: come si verifica la password in un secondo momento? Devi essere in grado di generare lo stesso hash più tardi, e non puoi farlo con 'uniqid'. ['uniqid'] (http://php.net/manual/en/function.uniqid.php) non è pensato per le password, ma per la generazione di ID univoci (come gli UUID). –

+1

Perché un -1? Cosa c'è di sbagliato in questa risposta? –

2

A dire il vero, non utilizzerei nemmeno MD5 come algoritmo di hash per la memorizzazione delle password. Vorrei esaminare l'utilizzo di qualcosa come bcrypt. Inoltre, non capisco nemmeno come funzionerà il tuo esempio, ma in ogni caso se vuoi assicurarti di stare al sicuro da md5, sha1 come minimo e impara dagli altri errori e usa un sale.

+0

Penso che md5 possa essere sicuro se si utilizza un buon salt, ma sono d'accordo sul fatto che i nuovi algoritmi sono la strada da percorrere. –

+1

@Rocket Se si usa md5() solo per hash una password con un sale non è sicuro – PeeHaa

+0

MD5 è stato ottimizzato in termini di prestazioni e quindi in alcuni casi è possibile forzarlo ancora, ma non lo farei consiglia MD5 per un'implementazione sicura dell'hash delle password. – sean

11

No, non è un modo sicuro. È crackabile e, nel tuo esempio, non è ripetibile. Dovresti memorizzare il valore casuale a lungo con l'hash stesso. Se il DB viene compromesso, diventa estremamente semplice eseguire il bruteforce dell'hash.

Dovresti sapere che MD5 e SHA1 sono due degli algoritmi di hashing più deboli, disponibili in PHP.

Molto meglio è utilizzare la funzione crypt(), con CRYPT_BLOWFISH o PBKDF2.

aggiornamento

Inoltre, come detto PeeHaa, non funziona. mt_rand('password', 15) causerà Warning: mt_rand() expects parameter 1 to be long, string given on line X.

+0

@PeeHaa, beh, sì, perché non è ripetibile. –