Игровая авторизация

j0gurt

Проверенные
Сообщения
47
Реакции
25
Баллы
5,515
Доброго времени суток, уважаемые форумчане. Собственно, пилю игровой проект и сейчас встал вопрос о реализации авторизации в клиенте игры. Как я понимаю, в игровом клиенте реализовать алгоритм шифрования пароля, что юзается в xenforo, невозможно. Есть мысля при регистрации брать тот же самый пароль, кодировать его, например, в md5 и заносить в отдельную табличку в бд. Ну и сравнивать уже, непосредственно, md5 хеши. Вторая проблемка заключается в изменении этого пароля. Как это можно сделать и в какие файлы лезть?
 
Последнее редактирование:
Смотрите работу авторизации + как работает и как сделать тут уже описано не раз.
Было бы идеально попросить толкового человека написать под это все плагин. Не за спасибо, разумеется. Повторюсь, что вопрос состоит в сравнивании паролей, а не их расшифровке и угоне =) Своими корявыми руками лезть в движок и криво-косо его править довольно таки опасно. Кстати, если есть такой на примете, то прошу поделиться контактами :P
 
Было бы идеально попросить толкового человека написать под это все плагин. Не за спасибо, разумеется. Повторюсь, что вопрос состоит в сравнивании паролей, а не их расшифровке и угоне :-) Своими корявыми руками лезть в движок и криво-косо его править довольно таки опасно. Кстати, если есть такой на примете, то прошу поделиться контактами :P
Авторизация в клиенте? Проще простого. Используйте API
 
Да можно и без него сделать и без файлов движка.

Формула для пароля: library/XenForo/Authentication/Core.php
sha1(sha1(password) . salt)
или
sha256(sha256(password) . salt)
Код:
    protected function _setupHash()
    {
        if ($this->_hashFunc)
        {
            return;
        }

        if (extension_loaded('hash'))
        {
            $this->_hashFunc = 'sha256';
        }
        else
        {
            $this->_hashFunc = 'sha1';
        }
    }
Создание пароля:
Код:
public function generate($password)
{
   if (!is_string($password) || $password === '')
   {
      return false;
   }

   $salt = $this->_createHash(self::generateSalt());
   $data = $this->_newPassword($password, $salt);
   return serialize($data);
}
Авторизация:
Код:
    public function authenticate($userId, $password)
    {
        if (!is_string($password) || $password === '' || empty($this->_data))
        {
            return false;
        }

        $userHash = $this->_createHash($this->_createHash($password) . $this->_data['salt']);
        return ($userHash === $this->_data['hash']);
    }
Если XF > 1.2 тогда используется bcrypt. Предполагаю проект написан на C# поэтому

Ну или использовать это для более легкой реализации
 
library/XenForo/ControllerPublic/Account.php
В нем уже проверки находятся которые вызывают датаврайтер для изменения в бд
Код:
$input = $this->_input->filter(array(
            'old_password' => XenForo_Input::STRING,
            'password' => XenForo_Input::STRING,
            'password_confirm' => XenForo_Input::STRING
        ));
Код:
        $writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
        $writer->setExistingData($userId);
        $writer->setPassword($input['password'], $input['password_confirm'], null, true);
        $writer->save();

library/XenForo/DataWriter/User.php
Код:
    /**
     * Sets the user's password.
     *
     * @param string $password
     * @param string|false $passwordConfirm If a string, ensures that the password and the confirm are the same
     * @param XenForo_Authentication_Abstract|null $auth Auth object to generate the password (or null to use default)
     * @param boolean If true, do not accept an empty password
     *
     * @return boolean
     */
    public function setPassword($password, $passwordConfirm = false, XenForo_Authentication_Abstract $auth = null, $requirePassword = false)
    {
        if ($requirePassword && $password === '')
        {
            $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
            return false;
        }

        if ($passwordConfirm !== false && $password !== $passwordConfirm)
        {
            $this->error(new XenForo_Phrase('passwords_did_not_match'), 'password');
            return false;
        }

        if (!$auth)
        {
            $auth = XenForo_Authentication_Abstract::createDefault();
        }

        $authData = $auth->generate($password);
        if (!$authData)
        {
            $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
            return false;
        }

        $this->set('scheme_class', $auth->getClassName());
        $this->set('data', $authData, 'xf_user_authenticate');
        return true;
    }
Как выше я и писал вызовется тот же метод для генерации пароля.
Создание пароля:
public function generate($password)
{
if (!is_string($password) || $password === '')
{
return false;
}

$salt = $this->_createHash(self::generateSalt());
$data = $this->_newPassword($password, $salt);
return serialize($data);
}
Метод set, который выполняет обновление:
Код:
/**
    * Sets a field. This value will be updated when save is called.
    *
    * @param string Name of field to update
    * @param string Value to update with
    * @param string Table name, if empty then all tables with that column
    * @param array  Options. See {@link $_setOptions).
    *
    * @return boolean
    */
 
Да я вот и думаю, может ТСу стоит заюзать API? Вы согласны со мной? :-) Кто согласен - ставим лойс, делаем репост!
Просто месье знает толк в извращениях :)
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу