Доброго времени суток. Подскажите как записать, точнее как использовать crypt(); для записи пароля в базу данных, а затем как сравнивать с пользовательским вводом. вот например такая запись в базу данных PHP: <? $pswd = crypt(htmlspecialchars($_POST['pswd']), $bot); /* а затем вставка в БД */ ?> авторизация PHP: <? $pswd_form = htmlspecialchars($_POST['pswd']); //............. if(crypt($pswd_form, $bot) == $row['password']) { header("Location: ".$_SERVER['DOCUMENT_ROOT']."/mail/admin/index.php?flag=1"); } else { throw new Exception; } ?> Пароли различны.
Насколько я знаю, $_SERVER['DOCUMENT_ROOT'] - отдает серверный путь к корневой директории сервера, следовательно получится что-то типа "/usr/local/apache/htdocs/mail/admin/index.php?flag=1. Бред получается. В Location нужно указывать абсолютный путь...мне так кажется...
А это разве не абсолютный путь? Да и не в тему(главное что работает этот путь нормально!) это для ознакомления http://www.phpfaq.ru/paths
Ну наверное всё таки пользовательский ввод. Если, насчёт типа что он "мешает", и без этой функции не работает.
Да почему же если я заменяю html при вводе, а если ведут вместо пароля какой нибудь косячный скрипт? Если он даже заменит html то мне кажется нечего пароли создавать с html тегами.
Ну и что сделает косячный скрипт, будучи захешированным в md5 и отправленным в базу? Скрипт срабатывает если появляется на странице. Ты собираешься выводить пароль на страницу в открытом виде? Что же касается создания паролей с тегами, то 1. пусть создает 2. htmlspecialchars и strip_tags в любом случае разные вещи.
Генерация Код (Text): $salt = '$1$'.substr(md5(time()),0,8).'$'; $hash = crypt($_POST['pswd'], $salt); Проверка Код (Text): if (crypt($_POST['pswd'], $row['password']) == $row['password']) { /* упешно */ } else { /* нет */ }
Кстати, а что в приведенном в 1-м посте примере помешает человеку перейти на URL ..mail/admin/index.php?flag=1 минуя авторизацию?
Почему crypt, а не md5... я бы набросал это так, в порядке убывания важности =) 1. "Защита от дурака" (подразумевается программист, который не особо вкурсе про хранение пароля и думает, что md5($_POST['pswd']) - это хорошо) 2. Защищенность и повышенная криптостойкость (ну, наверно самая повышенная криптостойкость была бы у собственного алгоритма хеширования, если бы он на 100% был скрыт от злоумышлеников. Т.к. такое не бывает - лучше воспользоваться мировым опытом =) К слову, md5 crypt уже совсем не так хорош... с ростом скоростей процессоров, но остальные алгоритмы, как и свой собственный приводят к большим проблемам с пунктом 3) 3. Переносимость (md5 crypt есть _почти_ везде. на всех новых системах есть, может не быть на старых древних... кстати, кажется с 6-ки, для полной совместимости, в PHP включают и встроенный crypt)
ну... от дурака ничего не спасет. Насчет повышенной криптостойкости тоже тонкий вопрос. соленый md5 вполне достаточен для большинства задач. При этом я не уверен, что встроенный в систему алгоритм точно лучше чем md5. C другой стороны, интересно, как будет работать crypt() если сайт надо будет перевести на другой хостинг с другой системой? Я просто ни разу им не пользововался, поэтому просто не в курсе - если алгоритм берется тот который есть в системе и они не совпадают, то старые пароли должны просто пропасть? Если так, то md5 хорош уже тем, что системонезависим. Собственно, этим хорош любой алгоритм хеширования, о котором точно известно что используется именно он. Или я чего-то не понял?
Так почитайте =) http://en.wikipedia.org/wiki/Crypt_(Unix) В двух словах - там тот же md5, толко прогоняется через тысячи операций хеширования. Смысл простой - для стандартных систем это особо заметно не будет, а для систем прогоняющих пароли по словарям или перебором - уменьшит скорость перебора в эти самые тысячи раз. Сначала в crypt был DES. Потом там появился MD5. Какой алгоритм использовать определяется по соли. DES соль - два символа, MD5 соль - $1$12345678$. crypt() с поддержкой md5 есть почти уже везде. Теоретически можно наткнуться на хостера с какой-нить старой необновленной freebsd со старыми библиотеками где нет crypt md5... ну теоретически можно и на хостера без php5 наткнуться. Идеальный бы вариант использовать Blowfish или sha варианты crypt - они еще более осложняют брутфорсинг паролей, но вот тут уже реальные проблемы с совместимостью, по-этому увы только md5. md5 - да, а метод соления - нет. А md5 без соления, это вообще не для паролей. Таким образом две системы с разным солением - не совместимы. Этим и хорош crypt - он тоже стандартизирован, т.е. $1$ на любых системах где есть crypt который умеет md5 работает одинакого и если два продукта используют крипт - интеграция становится легка.
Дикость какая-то. Если я правильно помню лекции по защите данных, то тысяча операций хеширования одного и того же слова ухудшает а не улучшает криптозащиту из за неизбежности коллизий. Против брутфорса по словарю применяется соление - и скорость перебора уменьшается не в тысячи раз, а вообще - этого слова нет в словаре. Против перебора по символам ничего не помогает. Потому что подбирается не хэш. Что значит "определяется по соли"? Я вызываю crypt() без соли. crypt генерирует и добавляет соль сам. Какую, DES или md5? Завтра в какой-нибудь nix вставят HAVAL или SHA-2 как базовый алгоритм. Что вернет crypt? Я перенесу хостинг на сервер с Windows Longhorn (мало ли) - как отработает crypt? А на NetWare? Когда я использую md5, метод соления я определяю сам. Система не солит. Соль добавляется так как программист ей скажет. И от переноса на другой хостинг это не изменится никак. Интеграция вообще не нужна.
Без цифр о "вероятносях коллизий" тут говорить нечего. А так же без осознания того, чем же так страшны коллизии при шифровании пароля. Только в случае неизвестного алгоритма соления. Еще раз - криптовать пароли полагаясь, что ваш алгоритм соления не смогут узнать - изначально глупо. Зная алгоритм соления - что мешает построить свой словарь? Тоже самое с подбором буквами. Да? а что же, при подборе по буквам подбирается? Резонанс в 10-й галактике? Код (Text): Я вызываю crypt() без соли. crypt генерирует и добавляет соль сам. А _зачем_ вы вызываете crypt без соли? Потому что не умеете с ним работать? Или еще причины есть? На windows работает, на нетваре предоставлю вам самим проверить, если очень хочется. В любом случае, даже если встретится реализация с отсутствующим или неподдерживающим MD5 криптом - соответствующий PHP класс находится за 2 минуты и интегрируется за 5-10. Если вы работаете только со своим кодом, написанным только вами и больше никогда не будете работать с другим кодом - интеграция не нужна. Но когда один программист-эстет встречается с софтом другого программиста-эстета (и у каждого свой способ соления)... тут все и начинается. Особо если уже есть база паролей одного из типов, а еще хуже - когда нужно сливать две базы юзеров, и у каждой - свое соление.
Время - это именно тот ресурс, которого становится все больше и больше. И именно для борьбы с этим и изобретают более математически-сложные алгоритмы или просто ставят на них циклы =)