(PHP) Как правильно реализовать crypt () - PullRequest
7 голосов
/ 10 февраля 2010

Вот пример со страницы руководства PHP для 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!";
}
?>

Почему это работает? Я так понимаю 'mypassword' - это пароль, который я хочу использовать для фактического администратора. Поэтому я сначала склеил это и установил его равным $password. Очевидно, что я должен хранить это в БД. Но в следующих строках он используется как соль и то, с чем я сравниваю, и я не понимаю, как crypt($user_input, $password) может быть равно $password, если в этом последнем случае у меня в идеале правильный пароль как $user_input, но с добавлением $password по сравнению с $password. Для меня было бы больше смысла, если бы последняя строка была

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

Что я не понимаю?

1 Ответ

8 голосов
/ 10 февраля 2010

crypt является односторонней функцией и возвращает строку, которая уже содержит соль. Вывод аналогичен тому, что хранится в /etc/shadow.

Пример из 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/

При сравнении пользовательского ввода с результатом склепа функция автоматически извлекает соль из строки.

...