1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.0.4 Как XenForo шифрует пароли?

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Sashok724, 20.11.2011.

Загрузка
  1. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    собственно вопрос, на md5 не похоже
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    library/XenForo/Authentication/Core.php
     
    Sashok724 нравится это.
  3. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    Можно поподробнее? Там написано в коде "SHA1" и "SHA256", но ни один из этих методов не работает
     
  4. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Что не работает? Вы внимательно код смотрели? Ксен формирует хэш по схеме:
    1. Формируется хэш пароля
    2. К полученному результату добавляется соль
    3. Полученная строка снова хешируется
     
    Sashok724 нравится это.
  5. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    А метод шифровки какой? Я просто пишу скрипт для авторизации через XenForo:
    PHP:
        mysql_connect("localhost""root""****") or die($error);
        
    mysql_select_db("site") or die($error);
     
        
    $loadid mysql_query("SELECT * FROM xf_user WHERE username='$user'") or die ($error);
        
    $sort mysql_fetch_array($loadid);
        
    $id $sort['user_id'];
     
        
    $loadpass mysql_query("SELECT * FROM xf_user_authenticate WHERE user_id='$id'") or die ($error);
        
    $sort mysql_fetch_array($loadpass);
        
    $pass $sort['remember_key'];
    Вот на этом запутался. И еще вопрос - соль = serialize ? если да, то что именно он сеарилизует?
     
  6. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Соль.

    Метод — зависит от того, подключено ли расширение hash. Если подключено, то используется sha256. Если нет — sha1. Все это видно в файле library/XenForo/Authentication/Core.php.
     
    Sashok724 нравится это.
  7. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    спасибо, но при проверке с помощью
    PHP:
            $password 'PSP1004';        //Сам пароль
            
    $hash1 sha1($password);      //Хешируем первоначальный пароль
            
    $salt 'sflprt49fhi2';        //Генерируем случайный набор символов (соль)
            
    $hash2 sha1($hash1 $salt);  //Складываем старый хеш с солью и пропускаем через функцию md5()
            
    echo($hash2);
    он выдает 6ca6fc0576de72eea74026d7fda0a17caebc384d, а в бд в колонке remember_key записано f04237c1212986410f7b619d0687beaf5897eb2d (Пароли используются одинаковые)
    --- добавлено : 23 ноя 2011 в 13:37 ---
    Содержимое колонки data:
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Посмотрите внимательно, как генерируется соль. Она берется не просто так. Т.е., если соль разная, то и хеши, естественно, будут разные.
    Обратите внимание на всю процедуру генерирования, ибо описание процедуры формирования соли описана в другом файле, а псевдослучайное число - в третьем. В общем там нет ничего сверхестественного, но код нужно читать внимательней. К слову, количество символов для соли по умолчанию не 12, как у Вас.
     
  9. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    И судя по содержимому колонки data, в данном случае использовался метод sha256
     
  10. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    можно пример преобразования пароля в "формат" XenForo, а то уже запутался. sha256 пробовал. всеравно не совпадают
     
  11. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Пример — он есть в самом ксене. Вы можете отследить все взаимосвязи в файле library/XenForo/Authentication/Core.php.

    Теория.

    Вся информация о пароле пользователя хранится в таблице xf_user_authenticate.
    В столбце data хранится захэшированный пароль, соль и имя метода хеширования.

    Соль создается опять же путем хеширования псевдослучайной строки длиной 10 символов.
    Потом работает схема, которую я описал выше.

    И с чего это вы полученную строку сравниваете с полем remember_key? Данные из этого поля используются для сохранения в cookie.

    Если вы хотите сравнить вводимый пароль с сохраненным паролем пользователя, то надо делать так.

    1. Получить необходимую запись из таблицы xf_user_authenticate.
    2. Из записи вытащить (десериализировать) данные поля data.
    3. Полученные данные - hash - строка, которая содержит в себе закодированный пароль, salt - нужная вам соль, hashFunc - метод хеширования
    4. Теперь по схеме - хэшируем введенный пароль методом, указанным в hashFunc, к этому приклеиваем salt и снова хешируем указанным методом.
    5. Сравниваем полученную строку с существуещим hash.
     
    Sashok724 нравится это.
  12. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Готовый пример не буду выкладывать, а вот куски кода пожалуйста:

    library/XenForo/Application.php
    PHP:
            const DEFAULT_SALT_LENGTH 10;
    PHP:
            public static function generateRandomString($length)
            {
                    while (
    strlen(self::$_randomData) < $length)
                    {
                            
    // openssl_random_pseudo_bytes is *ridiculously* slow on windows
                            
    if (function_exists('openssl_random_pseudo_bytes') && substr(PHP_OS03) != 'WIN')
                            {
                                    
    self::$_randomData .= bin2hex(openssl_random_pseudo_bytes(max($length1024) / 2));
                            }
                            else
                            {
                                    
    self::$_randomData .= md5(uniqid(mt_rand(), true));
                            }
                    }

                    
    $return substr(self::$_randomData0$length);
                    
    self::$_randomData substr(self::$_randomData$length);

                    return 
    $return;
            }
    library/XenForo/Authentication/Default.php
    PHP:
            public static function generateSalt($length null)
            {
                    if (!
    $length)
                    {
                            
    $length self::DEFAULT_SALT_LENGTH;
                    }

                    return 
    XenForo_Application::generateRandomString($length);
            }
    library/XenForo/Authentication/Core.php
    PHP:
            protected function _newPassword($password$salt)
            {
                    
    $hash $this->_createHash($this->_createHash($password) . $salt);
                    return array(
    'hash' => $hash'salt' => $salt'hashFunc' => $this->_hashFunc);
            }
    PHP:
            protected function _createHash($data)
            {
                    
    $this->_setupHash();
                    switch (
    $this->_hashFunc)
                    {
                            case 
    'sha256':
                                    return 
    hash('sha256'$data);
                            case 
    'sha1':
                                    return 
    sha1($data);
                            default:
                                    throw new 
    XenForo_Exception("Unknown hash type");
                    }
            }
    PHP:
            protected function _setupHash()
            {
                    if (
    $this->_hashFunc)
                    {
                            return;
                    }

                    if (
    extension_loaded('hash'))
                    {
                            
    $this->_hashFunc 'sha256';
                    }
                    else
                    {
                            
    $this->_hashFunc 'sha1';
                    }
            }
    PHP:
            public function generate($password)
            {
                    if (!
    is_string($password) || $password === '')
                    {
                            return 
    false;
                    }

                    
    $salt $this->_createHash(self::generateSalt());
                    
    $data $this->_newPassword($password$salt);
                    return 
    serialize($data);
            }
    Думаю, из этого составить процедуру генерации и валидации хеша не представится сложным. Если каких-то функций не хватает, то найти, наверное, будет не сложным.
    --- добавлено : 23 ноя 2011 в 14:48 ---
    P.S. 2модераторы: Блин, вот даже не знаю, а можно ли выкладывать сюда какую-либо часть исходников? Ведь по идее этого делать нельзя? Если это так, то уберите лишний код, а оставьте только название функций, пожалуйста.
     
    Sashok724 нравится это.
  13. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    я не смог :(
     
  14. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Что именно вы не смогли?
     
  15. Sashok724

    Sashok724 Пользователь

    Регистрация:
    10.09.11
    Сообщения:
    33
    Симпатии:
    12
    Версия XF:
    1.0.4
    У меня всеравно разные хеши получаются.
     
  16. GELMESHIK

    GELMESHIK Местный

    Регистрация:
    24.05.12
    Сообщения:
    21
    Симпатии:
    1
    Версия XF:
    1.1.2
    А в стандартном "Core.php" какая "соль", чет не могу найти.?
     
  17. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Сама соль хранится в library/XenForo/Application.php. Смотрите функцию loadDefaultConfig.
     
  18. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Рандомная
    PHP:
            public static function generateSalt($length null)
            {
                    if (!
    $length)
                    {
                            
    $length self::DEFAULT_SALT_LENGTH;
                    }
     
                    return 
    XenForo_Application::generateRandomString($length);
            }
     
  19. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Стоп. Если я не ошибаюсь, то это не то, что Вам нужно.

    Да-да. Соль уникальна и рэндомна. А та, о которой я говорил, используется для капчи и для кук пользователя.
     
    Pepelac нравится это.
  20. GELMESHIK

    GELMESHIK Местный

    Регистрация:
    24.05.12
    Сообщения:
    21
    Симпатии:
    1
    Версия XF:
    1.1.2
    А как ее узнать?
     

Поделиться этой страницей