Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Защита паролей пользователей в БД  (Прочитано 9938 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Robin Hood PHD
Гость
« : 09-03-2008 20:18 » 

Доброго времени суток, Господа!

Пишем форум с нуля на php5, используем MySql (5.0.26) и естественно важным моментом является авторизация. У нас завязалась дискуссия по поводу защиты пароля записанного в БД.
Что будет надежнее, традиционное хранение паролей в MD5 хэшэ или использование функции MySql - PASSWORD (). Не понял
Возможно, есть еще какие либо возможности MySql позволяющие повысить уровень безопасности? Может Вы подскажите какие-либо пути повышения уровня защиты средствами php (5 версия) Не понял

Заранее благодарен за Ваши ответы.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 09-03-2008 20:47 » 

http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html Статья для размышления
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Robin Hood PHD
Гость
« Ответ #2 : 09-03-2008 21:05 » 

Спасибо, углядел интересную инфу....
Но вот все же сравнения md5 и password () так и не нашел....
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 09-03-2008 22:06 » 

ֵК MD5 очень трудно подобрать комбинацию. Только недавно сделали программу, которая подбирает комбинацию. Но программа требует довольно хороших вычислительных и материальных ресурсов.
Честно говоря для ַPassword я не нашел описание, какой именно алгоритм используется. Простой запрос
Код:
select MD5('mypass'), PASSWORD('mypass'), SHA1('mypass')
Показал, что это разные веши Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-03-2008 10:54 » 

Шифрование можно делать многократно, вдобавок, подмешивая какую-либо дополнительную информацию, характерную (и главное - постоянную) для конкретного пользователя и/или сервера.

Пример ниже - фрагмент кода SMF. На нем видно, какое разнообразие шифрования паролей только не делают. Родной для SMF метод - шифрование sha1 у клиента (JavaScript), а если этот метод не доступен, то отсылает класически - открытым текстом. Фрагмент кода начинается после того, как уже сделаны проверки для "родных" для SMF методов авторизации и делается попытка обработать пароль иначе (зачем - не знаю).

Код: (PHP)
        // Bad password!  Thought you could fool the database?!
        if ($user_settings['passwd'] != $sha_passwd)
        {
                // Maybe we were too hasty... let's try some other authentication methods.
                $other_passwords = array();

                // None of the below cases will be used most of the time (because the salt is normally set.)
                if ($user_settings['passwordSalt'] == '')
                {
                        // YaBB SE, Discus, MD5 (used a lot), SHA-1 (used some), SMF 1.0.x, IkonBoard, and none at all.
                        $other_passwords[] = crypt($_REQUEST['passwrd'], substr($_REQUEST['passwrd'], 0, 2));
                        $other_passwords[] = crypt($_REQUEST['passwrd'], substr($user_settings['passwd'], 0, 2));
                        $other_passwords[] = md5($_REQUEST['passwrd']);
                        $other_passwords[] = sha1($_REQUEST['passwrd']);
                        $other_passwords[] = md5_hmac($_REQUEST['passwrd'], strtolower($user_settings['memberName']));
                        $other_passwords[] = md5($_REQUEST['passwrd'] . strtolower($user_settings['memberName']));
                        $other_passwords[] = $_REQUEST['passwrd'];

                        // This one is a strange one... MyPHP, crypt() on the MD5 hash.
                        $other_passwords[] = crypt(md5($_REQUEST['passwrd']), md5($_REQUEST['passwrd']));

                        // Snitz style - SHA-256.  Technically, this is a downgrade, but most PHP configurations don't support sha256 anyway.
                        if (strlen($user_settings['passwd']) == 64 && function_exists('mhash') && defined('MHASH_SHA256'))
                                $other_passwords[] = bin2hex(mhash(MHASH_SHA256, $_REQUEST['passwrd']));
                }
                // The hash should be 40 if it's SHA-1, so we're safe with more here too.
                elseif (strlen($user_settings['passwd']) == 32)
                {
                        // vBulletin 3 style hashing?  Let's welcome them with open arms \o/.
                        $other_passwords[] = md5(md5($_REQUEST['passwrd']) . $user_settings['passwordSalt']);
                        // Hmm.. p'raps it's Invision 2 style?
                        $other_passwords[] = md5(md5($user_settings['passwordSalt']) . md5($_REQUEST['passwrd']));
                }

                // Maybe they are using a hash from before the password fix.
                $other_passwords[] = sha1(strtolower($user_settings['memberName']) . addslashes(un_htmlspecialchars(stripslashes($_REQUEST['passwrd']))));

                // Whichever encryption it was using, let's make it use SMF's now ;).
                if (in_array($user_settings['passwd'], $other_passwords))
                {
                        $user_settings['passwd'] = $sha_passwd;
                        $user_settings['passwordSalt'] = substr(md5(rand()), 0, 4);

                        // Update the password and set up the hash.
                        updateMemberData($user_settings['ID_MEMBER'], array('passwd' => '\'' . $user_settings['passwd'] . '\'', 'passwordSalt' => '\'' . $user_settings['passwordSalt'] . '\''));
                }
                // Okay, they for sure didn't enter the password!
                else
                {
                        // They've messed up again - keep a count to see if they need a hand.
                        $_SESSION['failed_login'] = @$_SESSION['failed_login'] + 1;

                        // Hmm... don't remember it, do you?  Here, try the password reminder ;).
                        if ($_SESSION['failed_login'] >= $modSettings['failed_login_threshold'])
                                redirectexit('action=reminder');
                        // We'll give you another chance...
                        else
                        {
                                // Log an error so we know that it didn't go well in the error log.
                                log_error($txt[39] . ' - <span class="remove">' . $user_settings['memberName'] . '</span>');

                                $context['login_error'] = $txt[39];
                                return;
                        }
                }
        }
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Robin Hood PHD
Гость
« Ответ #5 : 12-03-2008 19:39 » 

Спасибо всем!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines