За последние 24 часа нас посетили 67876 программистов и 1649 роботов. Сейчас ищут 975 программистов ...

Как правильно хранить пароль админа?

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

  1. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Приветствую.

    Сохранил пароль в БД в md5, данные из формы также зашифровываю и потом сравниваю.. $password = md5($password);

    Вот такая простейшая защита. Но я заметил недостаток который мне очень не понравился.. попробую объяснить на пальцах. Допустим у меня пароль 12345, случайно ввёл 1234 и к моему удивлению получил доступ в админку. Получается что в админку я уже по двум паролям смогу попасть. А если md5 не использовать то только по единственному паролю.

    В общем косяк какой-то с md5.. Попробовал sha1, тоже по двум паролям в админку захожу. Наверное я неправильно использую шифрование.. как нужно правильно?
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    С шифрование все в порядке, со скриптом проверки что то не то потому что 12345 не равно 1234, вот где косяк.

    Да кстати, md5 и sha1 это устаревшее шифрование, в смысле его не сложно взломать (одним словом узнать пароль) надо использовать метод crypt() только внимательно читайте описание к нему, он работает НЕ так как sha1
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    покажите код проверки. думаю у вас там ошибка.
    а md5 и sha1 непричем.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    сдается мне, что пароль 12345678кудах тоже сработает. У вас там ограничение на 4 символа скорее всего. Все, что больше - просто обрезается.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Про соль забыл :D
     
  6. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Вот код, никаких ограничений на кол-во символов, пароль только через trim и md5 пропускаю.., в базе varchar 32, я ставил 100 всё равно одно и тоже, в общем уникальность пароля после пропуска через md5 пропадает..

    Код (Text):
    1. $login = trim(strip_tags(mysql_real_escape_string($_POST['login'])));
    2. $password = trim($_POST['password']);
    3.  
    4. if(!empty($login) && !empty($password)) {
    5.            
    6.             $query = "SELECT *
    7.             FROM `users`
    8.             WHERE users.`login`='$login'";
    9.             $result = mysql_query($query);
    10.             if(!result) {
    11.                 exit('Запрос на выборку данных из базы не прошёл!');
    12.             }
    13.            
    14.             if(mysql_num_rows($result) > 0) {
    15.            
    16.                 $f = mysql_fetch_array($result, MYSQL_ASSOC);
    17.                 $password = md5($password);
    18.                
    19.                 if($f['password'] === $password) { 
    20.                     $_SESSION['user'] = TRUE;
    21.                     header("Location:?option=admin");
    22.                     exit();
    23.                 } else {exit('Не верный пароль или логин!');}
    24.             }
    25.             else {
    26.                 exit('Не верный пароль или логин!');
    27.             }
    28.         }
    29.         else {
    30.             exit('Заполните обязательные поля!');
    31.         }
    32.     }
    Добавлено спустя 30 минут 36 секунд:
    а из-за неверных настроек хостинга может такое быть?
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    может версия php с багом?
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    К делу не относится, но нахрена так делать?
    Код (Text):
    1. $login = trim(strip_tags(mysql_real_escape_string(
     
  9. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    пробелы по краям убрать надо? а от кода html очистить ? а кавычки обезопасить? вот и применил соответствующие функции...., может быть strip_tags лишнее, ну а так вроде всё по делу)

    Добавлено спустя 22 минуты 6 секунд:
    Код (Text):
    1. может версия php с багом?
    посмотрел, сравнил, похоже так оно и есть, там где вход по двум паролям - Версия PHP: 5.2.17,
    испробовал на PHP: 5.3.17 - md5 работает нормально, бывает же)

    Спасибо что помогли найти причину. Но уже загорелось вместо md5 использовать что-то более современное, вот про crypt() почитал а он только восемь символов шифрует, примеры в википедии посмотрел так и не понял как в базу данных зашифрованный пароль поместить, и про соль чё-то запутано)))
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Если пользователь вводит свой ник как мудак, с лишними пробелами и "тегами", вместо того чтобы ввести его так, как было сделано при регистрации - это проблемы пользователя, вводящего свой ник как мудак. А если у пользователя ник будет
    <br>other? Или типа того. Что дальше?
     
  11. imoisey

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

    С нами с:
    27 янв 2014
    Сообщения:
    113
    Симпатии:
    0
    По мне md5 сойдет еще.

    Дело говорит
    Код (Text):
    1.  
    2. md5($pass . 'ломани меня если сможешь');
     
  12. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Код (Text):
    1. md5($pass . 'ломани меня если сможешь');
    например если я соль в базу данных положу то там как её хранить? тоже в зашифрованном виде? или её вообще в базе не хранить?
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    дабы предотвратить разрастание темы на 100500 страниц из-за обсуждений соли и алгоритмов хеширования, предлагаю просто воспользоваться поиском по форуму. Тут дохрена материала на эту тему.
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    дежавю :)
    http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0% ... 0%B8%D1%8F)

    Пример на основе справки по crypt()
    Код (PHP):
    1. <?php
    2. header('Content-type: text/plain; charset=utf-8');
    3.  
    4. function saltGen($saltLen)
    5. {
    6.     $abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    7.     $abcLen = strlen($abc);
    8.     $salt = '';
    9.     for ($i = 1; $i <= $saltLen; ++$i) {
    10.         $salt .= $abc{mt_rand(0, $abcLen-1)};
    11.     }
    12.     return $salt;
    13. }
    14.  
    15. // what user enter on registration form
    16. $password = 'SomePassword';
    17.  
    18. // random blowfish salt
    19. $salt = '$2a$07$' . saltGen(22) . '$';
    20. echo "Salt: {$salt}\n";
    21. // hash is what we've writen to database instead of plain password
    22. $hash = crypt($password, $salt);
    23. $hashLen = strlen($hash); // 60
    24. echo "Hash: {$hash} ({$hashLen})\n";
    25.  
    26. // what user enter in login form
    27. $new_password = 'SomePassword';
    28. if (crypt($new_password, $hash) == $hash) {
    29.     echo "password is ok\n";
    30. } else {
    31.     echo "!!!WRONG!!!\n";
    32. } 
    соль всякий раз разная.
    в базе храним хеш, который содержит в себе соль.
    даже если таблица будет украдена, радужные таблицы не помогут, да и вообще подбор смысла не имеет.

    Код (Text):
    1.  
    2. Salt: $2a$07$hr9JKAQcvSTw5eP71mnO4z$
    3. Hash: $2a$07$hr9JKAQcvSTw5eP71mnO4uenPRYQWcRA4y8V6k3TasBErkoUvN1KW (60)
    4. password is ok
     
  15. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    artoodetoo, благодарю за пример кода, как котёнка носом тыкнули в миску с молоком..), теперь немного разобрался ,

    вот только у меня что-то не то, скопировал пример и посмотрел результат на локальном сервере - *Open Server*, $hash всего 13 символов получается а не 60 как в примере..

    Код (Text):
    1. Salt: $2a$07$QMBtxqaXemnTmcN5CH9AcO$
    2. Hash: $2K.jtJyW7epQ (13)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это неправильно :D

    Добавлено спустя 48 секунд:
    в открытом виде
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    desertFox, даже не знаю. предположу, что у тебя нет поддержки blowfish, поэтому происходит откат на какой-то иной алгоритм. проверь что тебе доступно: здесь
    видимо "в отсутствие" — это про ствой сервер
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    короче так быть не должно. разные пароли - разные хеши.
     
  19. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Такой вопрос, если я шифрую при помощи crypt, при этом использую в качестве $salt тот же пароль только "подредактированный", например переведу его в нижний регистр, и разверну в обратную сторону, примерно так:

    Код (Text):
    1. $pass = 'qwerty';
    2. $salt = strrev($pass); // превратит $salt = 'ytrewq'
    3.  
    4. $in_db = crypt ($pass, $salt);
    даст это какой то толк? или так
    Код (Text):
    1. ...
    2. $salt = strrev($pass . $pass);
    3. ...
    или вообще так:
    Код (Text):
    1. $pass = 'qwerty';
    2. $salt = strrev( sha1($pass) );
    3.  
    4. $in_db = crypt ($pass, $salt);
     
  20. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Именно так, причем на DES алгоритм, о котором вообще забыть нужно нынче.
    С 5.2, да еще на windows - нужно искать другие решения, у лучше сразу убиться об стенку с этим 5.2
     
  21. Artiom

    Artiom Новичок

    С нами с:
    9 фев 2014
    Сообщения:
    17
    Симпатии:
    0
    VLK, поиски гламурных решений привели меня к "пиши, как тебе удобно будет дальше с этим работать".
     
  22. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Код (Text):
    1. Именно так, причем на DES алгоритм, о котором вообще забыть нужно нынче.
    2. С 5.2, да еще на windows - нужно искать другие решения, у лучше сразу убиться об стенку с этим 5.2
    Open Server обновил, теперь всё нормально), наверное Вы правы, на windows сайт как - то по другому работает, приходится ещё тестить и на хостинге

    ещё вопрос, - 60 символов это постоянная цифра? от чего зависит кол-во символов если конечно изменить можно?
     
  23. imoisey

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

    С нами с:
    27 янв 2014
    Сообщения:
    113
    Симпатии:
    0
    В чем печалька способа?
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    соль должна быть всегда разной
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    NNNooooo, сейчас начнется волна на 9 страниц.