PHP crypt () возвращает неверный ответ

Я думаю, что я теряю свои мраморы здесь … У меня проблема на моем веб-сайте, где он случайно перестает принимать логины. Теперь я смог проследить его до crypt (), ведя себя очень странно.

В моей базе данных у меня есть зашифрованная версия пароля пользователей – так скажем Og12345678.

Когда пользователь входит в систему, они вводят свой пароль, я читаю соль из db, а затем склеиваю, что они ввели и сравнивают – обычно это работает очень хорошо.

Так что я делаю crypt ($ signedPassword, $ saltFromDb) – в этом случае соль будет Og, конечно. Обычно для данного пользователя шифр паролей работает нормально.

Когда что-то идет не так (и когда они это делают, это постоянное изменение, пока я не перезапускаю Apache), я обнаружил, что крипт начинает возвращать ОТЛИЧНЫЙ ответ для того же ввода с той же солью.

Однако он последователен, то есть, как только система пошла не так, склеп возвращает неверный ответ, но он всегда возвращает тот же неправильный ответ. Повторные обновления страницы показывают тот же результат. Эта же соль также подтверждается и в недавно полученном некорректном склепе, так что это не значит, что соль пропала где-то.

Если я перезапущу Apache и заново запустил скрипт без каких-либо изменений, результаты crypt вернутся к тому, как они должны быть.

Я ценю, что это не последний PHP (5.2.8), но будет оценивать любые взгляды на это, включая ли это известную ошибку, исправленную в более поздней версии (обновление PHP не является счастливой задачей с большим количеством сайтов, некоторые из которых по-прежнему используют неудачные причуды, которые все должны быть повторно протестированы с каждым обновлением) – если это известная исправленная ошибка, то, очевидно, я все ее обновляю как можно скорее, кроме того, возможно, будет проще перенаправить внешний вид склепа, поскольку я использую его только в одном общее место для моего сайта.

Любой вход оценивается.

Мэтт Педлдсден

— Обновление: 11 марта 2011 г.

Исправление комментариев, ранее сообщавшихся об операционной системе … – Операционная система – Windows Server 2008 SP1 64 бит. Извиняюсь, что я должен был дважды проверить, а не предполагать, что я помню! Машина представляет собой процессор AMD 2950 8gb Ram, Xeon.

Я начинаю думать так, как утверждает Кртек – когда система ушла в отчаяние, если я создаю новый crypt () (т. Е. Очень простой пример, когда я устанавливаю переменную в строку, склеиваю ее, а затем сравниваю с криптой) – все отлично работает. Когда я перезапускаю сервер, снова все возвращается к предыдущим вычислениям снова. Поэтому я определенно склоняюсь к чему-то, что меняет алгоритм, используемый для вычисления результата crypt () … любых мыслей о том, что может привести к этому? Я распечатал значения CRYPT_STD_DES и т. Д., И они не меняются между перезапусками.

Кто-нибудь понял, что может случиться?

Как бы то ни было, это казалось, случалось дважды в один день вчера, самое странное.

Спасибо за ответы до сих пор.

— Обновление: 16 марта 2011

Просто хотел предоставить другое обновление.

Это все еще происходит, по-прежнему не понимая, почему.

В случае, если кто-то столкнется с этим в будущем, я думаю, что мое решение, идущее вперед, будет состоять в том, чтобы сделать какой-то неприятный взлом, чтобы вытолкнуть все действия crypt () на внешнее приложение C # и перестать полагаться на PHP для их выполнения. Что-то идет не так, и в этот момент единственное решение, которое я вижу, – это полностью удалить его из уравнения.

Конечно, если это все еще произойдет, это будет интересно узнать! 🙂

Спасибо всем.

Related of "PHP crypt () возвращает неверный ответ"

Почему ты читаешь соль? И как вы получаете соль? Различные алгоритмы используют разные методы для включения соли в выход.

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

  $crypted='Og12345678'; if (crypt($_POST['password'], $crypted)==$crypted) { .... 

И разойти DES DES? В самом деле?

В прошлый раз, когда я посмотрел, реализация скрипта PHP вызовет функцию crypt (), предоставляемую системой, поэтому, если у нее есть broekn, то она скорее будет вашей ОС, чем PHP, но вы не сказали, что такое ваша ОС.

Возможно, это вредоносный патч Suhosin PHP, влияющий на вашу функцию crypt (). Он изменяет многие методы шифрования / случайного использования и может быть причиной вашей проблемы.

Проверьте phpinfo () и посмотрите, находится ли «suhosin» где угодно на странице. Если он есть, посмотрите на отключение некоторых его функций в конфигурации php.

У меня была такая же проблема с криптой … У меня была проверка входа в систему на двух серверах, но когда я переношу ее на самую новую, она в конечном итоге перестает работать. Я обойду его с помощью шифрования md5 следующим образом: В register.php

  $encrypted = md5($_POST["pass"]); ... 

И затем в login.php

 $password = md5($_POST["password"]); if ($password == $row["hash"]) { // remember that user's now logged in by storing user's details in session $_SESSION["id"] = $row["id"]; $_SESSION['username'] = $_POST['username']; $_SESSION['logged'] = 'Yes'; // redirect to homepage redirect("index.php"); } 

Надеюсь, это поможет 🙂

Я столкнулся с такой же проблемой. Поскольку перенос моей установки vTigerCRM на локальный компьютер, вход пользователя с ранее сохраненными паролями начинался с сбоя. Кажется, что crypt () возвращает разные хэши в разных средах с теми же аргументами:

В локальной среде:

 SYSTEM: Windows NT 6.1 build 7601 (Business Edition Service Pack 1) i586 PHP: 5.3.5 crypt('hello world','$1$ad0000000'): $1$ad00000008tTFeywywdEQrAl9QzV.M1 

О производственной среде:

 SYSTEM: Linux 2.6.18-338.9.1.el5.lve0.8.32 #1 x86_64 PHP: 5.3.5 crypt('hello world','$1$ad0000000'): $1$ad000000$8tTFeywywdEQrAl9QzV.M1