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

1.4.x Структура таблицы xf_user_authenticate

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

Загрузка
  1. Firkys

    Firkys Местный

    Регистрация:
    02.06.11
    Сообщения:
    16
    Симпатии:
    2
    Здравствуйте, пытался найти в паутине интерната какую либо информацию описывающую структуру поля data, но к сожалению поиск не увенчался успехом.

    a:1:{
    s:4:"hash";
    s:60:"$2a$10$WST8FuKT0zvItcwrwpSxp.jeZ8lSesfTiXVEiPz3AEW0BDCsBDsyO";}

    Я одного не понимаю, почему в таблице указывается s как длина полей, также уточняется, что здесь лежит hash? Почему нельзя было изначально хранить сразу хеш, без лишней информации?

    Разве здесь, ещё что-то может хранится кроме хеша?
     
  2. Smalesh

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

    Регистрация:
    02.02.15
    Сообщения:
    50
    Симпатии:
    13
    Версия XF:
    1.4.4
    Потому что там может лежать тот же sha1/sha256 - суть в том, что xenforo использует несколько вариантов аутентификации

    Загляни в /library/XenForo/Authentication

    PHP:
    protected function _setupHash()
        {
            if (
    $this->_hashFunc)
            {
                return;
            }

            if (
    extension_loaded('hash'))
            {
                
    $this->_hashFunc 'sha256';
            }
            else
            {
                
    $this->_hashFunc 'sha1';
            }
        }



    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");
            }
        }
     
    Firkys нравится это.
  3. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Ну элементарно ведь. Из таблицы считывается значение из поля, которое после десериализации становится массивом, в котором ключем является тип хеша, а значением элемента массива - сам хеш. В противном случае потребовалось бы еще одно поле для хранения. В общем разработчикам проще использовать serialize/unserialize, чем array и разносить все по разным полям. Также они в любой момент времени могут изменить алгоритм, который не потребует изменения структуры базы данных. То есть для них такая реализация хранения рациональнее оказалась, чем использование дополнительных полей.
     
    Firkys нравится это.
  4. Firkys

    Firkys Местный

    Регистрация:
    02.06.11
    Сообщения:
    16
    Симпатии:
    2
    Благодарю. Иначе говоря там может храниться всегда только информация связанная с хешем и сам хеш?
     
  5. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    По идее да.
     
  6. Firkys

    Firkys Местный

    Регистрация:
    02.06.11
    Сообщения:
    16
    Симпатии:
    2
    Ещё кое-что не понимаю, зная пароль можно ли воссоздать хеш? Ибо посмотрел "формулы" везде требуется соль и пароль, а где взять соль не очень понимаю...
     
  7. Exile

    Exile Местный

    Регистрация:
    27.06.11
    Сообщения:
    999
    Симпатии:
    546
    Версия XF:
    1.4.4
    Принцип генерации SHA смотрите, там и будет разгадка откуда соль берется.
     
  8. FractalizeR

    FractalizeR XenForo Addicted Команда форума

    Регистрация:
    27.09.10
    Сообщения:
    1.085
    Симпатии:
    823
    Версия XF:
    1.3.2
    Это формат сериализатора PHP. a:1 означает, что следом в фигурных скобках идет массив из одного элемента. s:4 - что следом в кавычках идет строка из четырех символов. При выводе массивов сначала идет ключ, затем через точку с запятой значение, связанное с этим ключом.

    То, что для строк указывается итоговый полный размер, а для массивов нет, вероятно связано с тем, как PHP хранит эти два типа данных. Массивы хранятся в виде связанных списков. Для них память может выделяться кусочками, расположенными в разных областях памяти. Строки же требуют, чтобы для них был выделен непрерывный кусок памяти определенного размера. То есть, зная размер строки заранее, при десериализации ее можно быстрее разместить в памяти, поскольку вы заранее знаете ее размер и можете выделить блок для размещения ее десериализованного значения.

    Итак, в той сериализованной строке лежит просто информация о том, что "hash" = "$2a$10$WST8FuKT0zvItcwrwpSxp.jeZ8lSesfTiXVEiPz3AEW0BDCsBDsyO".

    Хэш начинается со строки "$2a$10$". "$" - это разделитель полей в данном случае. "2а" - это версия алгоритма BCrypt, которая использовалась для хеширования. В частности это означает, что дальше через точку будут идти 22 символа "соли", а потом 31 символ самого хэша.

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

    Почему нельзя было изначально хранить сразу хеш, без лишней информации?
    В принципе, я могу написать алгоритм хранения паролей, который будет хранить и еще что-то. Для того, чтобы обеспечить авторам импортеров максимальный уровень свободы, XenForo позволяет хранить любые данные в качестве информации о пароле пользователя. Например, мы могли бы хранить версию BCrypt в отдельном поле рядом с "hash", а не внутри строки с данными. И получилось бы что-то вроде

    Код:
    a:1:{
    s:4:"hash";
    s:57:"$10$WST8FuKT0zvItcwrwpSxp.jeZ8lSesfTiXVEiPz3AEW0BDCsBDsyO";s:7:"version";s:2:"2a";}
     
    Mirovinger нравится это.

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