За последние 24 часа нас посетили 66539 программистов и 1617 роботов. Сейчас ищут 1054 программиста ...

Использование crypt();

Тема в разделе "PHP для новичков", создана пользователем Greg1978, 18 фев 2009.

  1. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Доброго времени суток.
    Подскажите как записать, точнее как использовать crypt(); для записи пароля в базу данных, а затем как сравнивать с пользовательским вводом.
    вот например такая запись в базу данных
    PHP:
    1.  
    2. <?
    3. $pswd = crypt(htmlspecialchars($_POST['pswd']), $bot);
    4. /* а затем вставка в БД */
    5. ?>
    6.  
    авторизация
    PHP:
    1.  
    2. <?
    3. $pswd_form =  htmlspecialchars($_POST['pswd']);  
    4.  
    5. //.............
    6.  
    7. if(crypt($pswd_form, $bot) == $row['password']) {
    8.         header("Location: ".$_SERVER['DOCUMENT_ROOT']."/mail/admin/index.php?flag=1");  
    9.     } else {
    10.         throw new Exception;
    11.     }
    12. ?>
    13.  
    Пароли различны.
     
  2. SLV

    SLV Активный пользователь

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    юзай md5 вместо crypt
     
  3. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    А зачем тебе htmlspecialchars пароля?
     
  4. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Насколько я знаю, $_SERVER['DOCUMENT_ROOT'] - отдает серверный путь к корневой директории сервера, следовательно получится что-то типа "/usr/local/apache/htdocs/mail/admin/index.php?flag=1. Бред получается.
    В Location нужно указывать абсолютный путь...мне так кажется...
     
  5. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    А это разве не абсолютный путь?
    Да и не в тему(главное что работает этот путь нормально!)
    это для ознакомления http://www.phpfaq.ru/paths
     
  6. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Ну наверное всё таки пользовательский ввод.
    Если, насчёт типа что он "мешает", и без этой функции не работает.
     
  7. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    +1
    Но всё же ...
     
  8. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Так ввод же, а не вывод. Заменять символы в пароле - плохо.
     
  9. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Да почему же если я заменяю html при вводе, а если ведут вместо пароля какой нибудь косячный скрипт?
    Если он даже заменит html то мне кажется нечего пароли создавать с html тегами.
     
  10. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Ну и что сделает косячный скрипт, будучи захешированным в md5 и отправленным в базу? Скрипт срабатывает если появляется на странице. Ты собираешься выводить пароль на страницу в открытом виде?
    Что же касается создания паролей с тегами, то
    1. пусть создает
    2. htmlspecialchars и strip_tags в любом случае разные вещи.
     
  11. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Понятно, Спасибо!
     
  12. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Действительно Бред ступил сорри!!! :oops: :D
     
  13. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Генерация
    Код (Text):
    1. $salt = '$1$'.substr(md5(time()),0,8).'$';
    2. $hash = crypt($_POST['pswd'], $salt);
    Проверка
    Код (Text):
    1. if (crypt($_POST['pswd'], $row['password']) == $row['password']) { /* упешно */ } else { /* нет */ }
     
  14. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    -1
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Кстати, а что в приведенном в 1-м посте примере помешает человеку перейти на URL ..mail/admin/index.php?flag=1 минуя авторизацию?
     
  16. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    почему -1?
     
  17. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Почему crypt, а не md5... я бы набросал это так, в порядке убывания важности =)
    1. "Защита от дурака" (подразумевается программист, который не особо вкурсе про хранение пароля и думает, что md5($_POST['pswd']) - это хорошо)
    2. Защищенность и повышенная криптостойкость (ну, наверно самая повышенная криптостойкость была бы у собственного алгоритма хеширования, если бы он на 100% был скрыт от злоумышлеников. Т.к. такое не бывает - лучше воспользоваться мировым опытом =) К слову, md5 crypt уже совсем не так хорош... с ростом скоростей процессоров, но остальные алгоритмы, как и свой собственный приводят к большим проблемам с пунктом 3)
    3. Переносимость (md5 crypt есть _почти_ везде. на всех новых системах есть, может не быть на старых древних... кстати, кажется с 6-ки, для полной совместимости, в PHP включают и встроенный crypt)
     
  18. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    ну... от дурака ничего не спасет. Насчет повышенной криптостойкости тоже тонкий вопрос. соленый md5 вполне достаточен для большинства задач. При этом я не уверен, что встроенный в систему алгоритм точно лучше чем md5. C другой стороны,
    интересно, как будет работать crypt() если сайт надо будет перевести на другой хостинг с другой системой? Я просто ни разу им не пользововался, поэтому просто не в курсе - если алгоритм берется тот который есть в системе и они не совпадают, то старые пароли должны просто пропасть? Если так, то md5 хорош уже тем, что системонезависим. Собственно, этим хорош любой алгоритм хеширования, о котором точно известно что используется именно он. Или я чего-то не понял?
     
  19. SLV

    SLV Активный пользователь

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    для любителей экзотики есть sha1
     
  20. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Так почитайте =) 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 работает одинакого и если два продукта используют крипт - интеграция становится легка.
     
  21. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Дикость какая-то. Если я правильно помню лекции по защите данных, то тысяча операций хеширования одного и того же слова ухудшает а не улучшает криптозащиту из за неизбежности коллизий. Против брутфорса по словарю применяется соление - и скорость перебора уменьшается не в тысячи раз, а вообще - этого слова нет в словаре. Против перебора по символам ничего не помогает. Потому что подбирается не хэш.

    Что значит "определяется по соли"? Я вызываю crypt() без соли. crypt генерирует и добавляет соль сам. Какую, DES или md5?
    Завтра в какой-нибудь nix вставят HAVAL или SHA-2 как базовый алгоритм. Что вернет crypt?
    Я перенесу хостинг на сервер с Windows Longhorn (мало ли) - как отработает crypt? А на NetWare?
    Когда я использую md5, метод соления я определяю сам. Система не солит. Соль добавляется так как программист ей скажет. И от переноса на другой хостинг это не изменится никак. Интеграция вообще не нужна.
     
  22. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    давайте поставим голосование :)
    Who is best of the best, algorithm md5 or crypt? :lol:
     
  23. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Без цифр о "вероятносях коллизий" тут говорить нечего. А так же без осознания того, чем же так страшны коллизии при шифровании пароля.
    Только в случае неизвестного алгоритма соления. Еще раз - криптовать пароли полагаясь, что ваш алгоритм соления не смогут узнать - изначально глупо. Зная алгоритм соления - что мешает построить свой словарь? Тоже самое с подбором буквами.
    Да? а что же, при подборе по буквам подбирается? Резонанс в 10-й галактике?
    Код (Text):
    1.  Я вызываю crypt() без соли. crypt генерирует и добавляет соль сам.
    А _зачем_ вы вызываете crypt без соли? Потому что не умеете с ним работать? Или еще причины есть?
    На windows работает, на нетваре предоставлю вам самим проверить, если очень хочется. В любом случае, даже если встретится реализация с отсутствующим или неподдерживающим MD5 криптом - соответствующий PHP класс находится за 2 минуты и интегрируется за 5-10.
    Если вы работаете только со своим кодом, написанным только вами и больше никогда не будете работать с другим кодом - интеграция не нужна. Но когда один программист-эстет встречается с софтом другого программиста-эстета (и у каждого свой способ соления)... тут все и начинается. Особо если уже есть база паролей одного из типов, а еще хуже - когда нужно сливать две базы юзеров, и у каждой - свое соление.
     
  24. время.
     
  25. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Время - это именно тот ресурс, которого становится все больше и больше. И именно для борьбы с этим и изобретают более математически-сложные алгоритмы или просто ставят на них циклы =)