2010-02-10 7 views
7

Aquí está el ejemplo de la PHP manual page for crypt():(PHP) Cómo aplicar correctamente la cripta()

<?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!"; 
} 
?> 

Por qué funciona esto? Lo tomo 'mypassword' es la contraseña que quiero que use el administrador real. Así que encripto eso primero, y lo configuro igual a $password. Obviamente, debo necesitar almacenar eso en DB. Pero en las siguientes líneas se está utilizando como sal y con lo que estoy comparando, y no entiendo cómo crypt($user_input, $password) puede ser igual a $password, si en este último caso tengo idealmente la contraseña correcta como $user_input pero salada con $password que se compara con $password. Tendría más sentido para mí si la última línea fuera

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

¿Qué no entiendo?

+0

debe usar técnicas más avanzadas como md5, sha1 etc. – dusoft

+1

hah. hah. hah. jaja. si solo estuvieras en este viaje épico conmigo, amigo mío. http://stackoverflow.com/questions/2235158/php-sha1-vs-md5-vs-sha256-which-to-use-for-a-php-login – sepiroth

Respuesta

8

crypt es una función de una sola dirección y devuelve una cadena que ya contiene la sal. La salida es similar a lo que se almacena en /etc/shadow.

Ejemplo de 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/ 

Al comparar la entrada del usuario con el resultado de cripta, la función extrae automáticamente la sal de la cadena.

+0

no entiendo cómo eso responde mi pregunta ... – sepiroth

+4

Responde perfectamente a tu pregunta. crypt() genera una cadena que contiene tanto la sal como el resultado del hash. Cuando le pasa esa cuerda como una sal, sabe extraer solo la parte de sal e ignorar la parte de almohadilla. Y todavía devuelve una cadena que contiene tanto la sal como el hash. Entonces estas cadenas se pueden comparar directamente. – gnud

+0

Eso es lo que dije. – AndiDog

Cuestiones relacionadas