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

1.1.1 Изменение шифрования паролей на md5

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

Загрузка
  1. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Добрый день, уважаемые форумчане! Возникла необходимость хранить пароли пользователей в мд5 виде. Знаю, что можно изменить шифрование в core.php, но сам боюсь там что либо трогать, т.к. только познакомился с xf.
    Если вы уже имели подобный опыт или знаете как это можно провернуть, то с радостью послушаю вас. Я уверен, что это достаточно актуальный вопрос, и ваша помощь пригодится не только мне)
     
  2. infis

    infis Местный

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

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Я знаю, сейчас форум пока не запущен, и пользователей нет еще, так что для будущих нужно сделать именно в md5
     
  4. infis

    infis Местный

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

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Такое ощущение, что мы говорим на одном языке, но вы меня не понимаете) Я знаю во что он кодируется, мне нужен не двойной md5 с солью, а просто md5
     
  6. Pepelac

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

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Вообще-то родные пароли XF хешируются через sha.
    Если вам надо это менять и кодировать только в md5 — посмотрите реализацию класса XenForo_Authentication_vBulletin и сделайте себе по образу и подобию
     
    lazy72 нравится это.
  7. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Получается так?
    PHP:
    <?php
    /**
    * vBulletin authentication method.
    *
    * @package XenForo_Authentication
    */
    class XenForo_Authentication_vBulletin extends XenForo_Authentication_Abstract
    {
      
    /**
      * Password info for this authentication object
      *
      * @var array
      */
      
    protected $_data = array();
      protected function 
    _createHash($password)
      {
        return 
    md5($password);
      }
      
    /**
      * Initialize data for the authentication object.
      *
      * @param string Binary data from the database
      */
      
    public function setData($data)
      {
        
    $this->_data unserialize($data);
      }
      
    /**
      * Generate new authentication data
      * @see XenForo_Authentication_Abstract::generate()
      */
      
    public function generate($password)
      {
        throw new 
    XenForo_Exception('Cannot generate authentication for this type.');
      }
      
    /**
      * Authenticate against the given password
      * @see XenForo_Authentication_Abstract::authenticate()
      */
      
    public function authenticate($userId$password)
      {
        if (!
    is_string($password) || $password === '' || empty($this->_data))
        {
          return 
    false;
        }
        
    $userHash $this->_createHash($password);
        return (
    $userHash === $this->_data['hash']);
      }
    }
    Я так понял проблема еще и в том, что пароль хранится не в виде строки, а в виде пакета. Как это можно поменять?
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Какой там пакет? В виде строки, конечно же.
     
  9. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Я честно в этом не сильно разбираюсь. Я имел в виду, что разные типы данных. Я попробовал использовать скрипт выше в качестве core.php (оставил class XenForo_Authentication_core), но ничего путного из этого не вышло.
     
  10. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если хотите написать плагин, то сначала поищите руководство по созданию плагина (оно есть здесь), а также другие плагины. Менять исходный код ксена крайне не рекомендую. Даже в самом плохом случае (когда нет возможности написать плагин, расширив стандартные классы) обращаются к разработчикам ксена с предложениями или вопросами, как это сделать. Если уж совсем все плохо, то пишут просто свои модели, вьюверы и контроллеры со своими шаблонами.
     
  11. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Нет, написать свой плагин я пока не готов, только перешел на xenforo и столкнулся с такой проблемой. Прочитаю руководство, может быть лучше стану понимать как устроен движок.
     
  12. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В Вашем случае, если хотите сделать собственную систему хеширования паролей, требуется писать плагин. Менять исходные коды ксена не стОит в любом случае.
     
  13. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Попробую написать разработчикам плагинов. Как идея для плагина, мне кажется, вполне интересная, и реализовать должно быть не очень сложно для тех, кто понимает что делает, а я точно не из них)
     
  14. Pepelac

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

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Я могу скзать одно — я не нахожу ни интересным, ни полезным менять более защищенный способ хранения паролей, применяющийся в ядре форума, на обычный md5.
     
    Mirovinger нравится это.
  15. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Защищенный - да, но шифрование md5 является более распространенным и используется многими системами, поэтому для интеграции с другими системами может понадобится именно такой тип шифрования.

    Да и потом если XF ставит на многофункциональность, то такая вещь, как выбор шифрования должна быть, имхо.
     
  16. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Так ведь никто не мешает добавлять свои методы хранения паролей. Хоть в чистом виде. Главное, правильно это оформить. Т.е. ксен изначально поддерживает различные методы хранения паролей, а также расширение уже существующих методов новыми.
     
  17. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Начинаю понимать как это работает) Но пошел другим путем - перевел пользователей на булку, а оттуда в КФ

    Возникла ещё одна проблема. Юзеров перевести я перевёл, а вот при регистрации получается старый метод шифрования. Т.к. я хочу интегрировать с другой системой - 2 разных шифрования ну совсем ни к чему. Как можно настроить так, что бы при регистрации пароли сохранялись как в vBulletin системе?

    При хешированаии пароля регистрации используется тот же класс, что и при авторизации? т.е. XenForo_Authentication_core ?
     
  18. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Почему именно плагин, и что отличает плагин от изменения кода?
    Дело в том, что я в конце концов добился желаемого, и всё вроде работает как надо.
    Привожу получившийся код ниже. Делал на базе core.php по аналогии с vBulletin.php
    PHP:
    <?php
     
    /**
    * Core authentication method.
    *
    * @package XenForo_Authentication
    */
    class XenForo_Authentication_Core extends XenForo_Authentication_Abstract
    {
        
    /**
        * Password info for this authentication object
        *
        * @var array
        */
        
    protected $_data = array();
     
        
    /**
        * Hash function to use for generating salts and passwords
        *
        * @var string
        */
        
    protected $_hashFunc 'md5';
     
        
    /**
        * Setup the hash function
        */
     
     
        /**
        * Perform the hashing based on the function set
        *
        * @param string
        *
        * @return string The new hashed string
        */
        
    protected function _createHash($data)
        {
            return 
    md5($data);
        }
     
        protected function 
    _newPassword($password$salt)
        {
            
    $hash md5(md5($password) . $salt);
            return array(
    'hash' => $hash'salt' => $salt'hashFunc' => $this->_hashFunc);
        }
     
        
    /**
        * Initialize data for the authentication object.
        *
        * @param string  Binary data from the database
        */
        
    public function setData($data)
        {
            
    $this->_data unserialize($data);
            
    $this->_hashFunc $this->_data['hashFunc'];
        }
     
        
    /**
        * Generate new authentication data
        * @see XenForo_Authentication_Abstract::generate()
        */
        
    public function generate($password)
        {
            if (!
    is_string($password) || $password === '')
            {
                return 
    false;
            }
     
            
    $salt $this->_createHash(self::generateSalt());
            
    $data $this->_newPassword($password$salt);
            return 
    serialize($data);
        }
     
        
    /**
        * Authenticate against the given password
        * @see XenForo_Authentication_Abstract::authenticate()
        */
        
    public function authenticate($userId$password)
        {
            if (!
    is_string($password) || $password === '' || empty($this->_data))
            {
                return 
    false;
            }
     
            
    $userHash md5(md5($password) . $this->_data['salt']);
            return (
    $userHash === $this->_data['hash']);
        }
    }
    Было бы очень интересно услышать что-нибудь, потому что код собирал как конструктор. Возможно он кривой и в нём есть дыры.
     
  19. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    При регистрации используется стандартная ксеновская схема аутентификации. Если нужно использовать не эту (дефолтную) схему, потребуется изменить либо одну строку в исходнике, либо писать плагин. Менять что-либо в исходниках ксена, мягко говоря, не принято. Остается плагин. Чисто теоретически плагин там не сложный, но при любых обновлениях движка ксена нужно будет просто проверять, а не изменился ли метод actionRegister в классе XenForo_ControllerPublic_Register. Если изменится, нужно будет просто скопировать весь этот метод в свой плагин и опять поправить одну строчку.

    Таким образом, Ваша задача имеет решение, но вот нужно ли это делать?

    По идее разные схемы аутентификации не должны сильно напрягать. Ведь не сложно при проверке пароля просто учитывать, какая схема была использована. Информация об этом в базе имеется. Собственно, сам ксен так и делает. Он при проверке пароля просто учитывает схему. И название схемы и хеш пароля лежат в одной таблице в одной записи.
    Чуть выше я описал.
    И, кстати, можно было обойтись изменением буквально одной строчки в исходнике ксена.

    Если Вы и дальше будете менять исходники, то Вам XenForo не нужен, он рассчитан на грамотных программистов. Поверьте просто на слово.
     
  20. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Понятное дело, что при авторизации можно учитывать любую схему, но мне же нужна была регистрация в том числе.
    Тут уж простите, но обходились так, как могли. Были бы знания как написать плагин\время для изучения, обязательно бы постарался сделать как надо, а не на коленке. Любой качественный продукт должен быть максимально понятным и легким в освоении для любого пользователя.
    Извините, но я уже не первый день спрашиваю советов на этом форуме, я понимаю, что вы ничем никому не обязаны, но если вы знали, как помочь мне и другим людям в подобной ситуации, отчего же вы молчали? Потраченные вами несколько минут могут спасти несколько часов нескольких других людей. Если бы я знал, как обойтись изменениями буквально одной строчки, я бы не тратил времени на кривые коды.
     

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