2010-02-10 21 views
7

Ecco l'esempio della PHP manual page for crypt():(PHP) Come implementare correttamente crypt()

<?php 
$password = crypt('mypassword'); // let the salt be automatically generated 

/* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
if (crypt($user_input, $password) == $password) { 
    echo "Password verified!"; 
} 
?> 

Perché fa questo lavoro? Lo prendo 'mypassword' è la password che voglio l'amministratore effettivo da usare. Quindi prima criptico e impostalo uguale a $password. Ovviamente, ho bisogno di memorizzarlo nel DB. Ma nelle righe successive è usato sia come sale che a cosa sto confrontando, e non capisco come crypt($user_input, $password) possa essere uguale a $password, se in quest'ultimo caso ho idealmente la password giusta come $user_input ma salata con $password rispetto a $password. Avrebbe più senso per me se l'ultima riga fosse

if (crypt($user_input) == $password) { 
    echo "Password verified!"; 
} 

Cosa non capisco?

+0

si dovrebbero usare tecniche più avanzate come md5, sha1 ecc. – dusoft

+1

hah. hah. hah. hahah. se solo tu fossi in questo epico viaggio con me, amico mio. http://stackoverflow.com/questions/2235158/php-sha1-vs-md5-vs-sha256-which-to-use-for-a-php-login – sepiroth

risposta

8

crypt è una funzione unidirezionale e restituisce una stringa che contiene già il sale. L'output è simile a quello memorizzato in /etc/shadow.

Esempio da php.net:

<?php 
echo 'result: ' . crypt('somepassword'); 
echo 'result: ' . crypt('somepassword'); 
echo 'result: ' . crypt('somepassword'); 
?> 

result: $1$K2D8DGwq$b05uO37aMwO4rnDlB9Rsi1 
result: $1$aPBvu2y.$213YVEs8/5m.jMCXSScly/ 
result: $1$dW3Xu2p6$nuCtJe2zzlgBMLxN2oZCx/ 

Confrontando l'input dell'utente con il risultato cripta, la funzione estrae automaticamente il sale dalla stringa.

+0

non capisco come questo risponda alla mia domanda .. – sepiroth

+4

Risponde perfettamente alla tua domanda. crypt() emette una stringa che contiene sia il salt che il risultato dell'hash. Quando lo passi come una stringa, sa di estrarre solo la parte sale e di ignorare la parte hash. E restituisce ancora una stringa contenente sia il sale che l'hash. Quindi queste stringhe possono essere confrontate direttamente. – gnud

+0

Questo è quello che ho detto. – AndiDog

Problemi correlati