2010-02-10 6 views
7

Voici l'exemple de la PHP manual page for crypt():(PHP) Comment implémenter correctement 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!"; 
} 
?> 

Pourquoi ce travail? Je le prends 'mypassword' est le mot de passe que je veux l'administrateur à utiliser. Donc, je crypte ce premier, et le mettre égal à $password. Évidemment, je dois devoir stocker cela dans la DB. Mais dans les lignes suivantes, il est utilisé à la fois comme le sel et ce que je compare, et je ne comprends pas comment crypt($user_input, $password) peut être égal à $password, si dans ce dernier cas, j'ai idéalement le bon mot de passe comme $user_input mais salé avec $password étant comparé à $password. Cela aurait plus de sens pour moi si la dernière ligne était

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

Qu'est-ce que je ne comprends pas?

+0

vous devriez utiliser des techniques plus avancées telles que md5, sha1, etc. – dusoft

+1

hah. Hé. Hé. hahah. si seulement vous étiez sur ce voyage épique avec moi mon ami. http://stackoverflow.com/questions/2235158/php-sha1-vs-md5-vs-sha256-which-to-use-for-a-php-login – sepiroth

Répondre

8

crypt est une fonction unidirectionnelle et renvoie une chaîne qui contient déjà le sel. La sortie est similaire à celle stockée dans /etc/shadow.

Exemple 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/ 

Lorsque l'on compare l'entrée de l'utilisateur du résultat de la crypte, la fonction extrait automatiquement le sel de la chaîne.

+0

Je ne comprends pas comment cela répond à ma question .. – sepiroth

+4

Il répond parfaitement à votre question. crypt() renvoie une chaîne qui contient à la fois le salt et le résultat du hachage. Lorsque vous passez cette chaîne comme un sel, elle sait extraire seulement la partie de sel et ignorer la partie de hachage. Et il renvoie toujours une chaîne contenant à la fois le sel et le hachage. Donc, ces chaînes peuvent être comparées directement. – gnud

+0

C'est ce que j'ai dit. – AndiDog

Questions connexes