Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,663
    Репутация:
    2145 ±

    PackHash - сжатие строки с хэшем (65 -> 8)

    Я написал эту функцию ещё больше года назад, просто не видел причин публиковать её.
    Теперь после того, как в SA:MP появилась возможность хеширования "из коробки", эта функция может кому-нибудь пригодиться.


    Описание:
    Упаковывает строку с хеш-суммой в массив целых чисел, занимающий меньше места.

    Параметры:
    hash[] - строка с хешем, которую нужно упаковать.
    cells[] - массив, в котором будет возвращён хеш в упакованном виде. Необходимый размер массива рассчитывается по формуле "(sizeof(hash) - 1) / charbits".
    hash_size - размер строки, в которой хранится хеш (необязательный параметр).
    cells_number - кол-во ячеек для сохранения упакованного массива (необязательный параметр).

    Возвращаемое значение:
    Возвращает константу PH_OK в случае успешного завершения, иначе - возвращает PH_ERR_INVALID_HASH, если в строке с хешем содержатся неизвестные символы, или PH_ERR_NOT_ENOUGH_CELLS, если в массиве cells недостаточно ячеек для сохранения результата. Также возвращает хеш в упакованном виде в массиве cells.

    Плюсы реализации:
    • Устранение проблемы с излишним использованием памяти.
      Обычно такие функции, как SHA256_PassHash, возвращают строку с хешем, где на каждое число в шестнадцатеричной системе (0-F) приходится 1 ячейка (именно ячейка, а не байт, возвращаемая строка не упакована!), т.е. по 32 бита.
      Однако для хранения числа от 0 до 15 достаточно всего 4 бит, что в 8 раз меньше!
      Сжав хеш с паролем игрока, можно добиться значительного уменьшения всех данных игрока, поскольку на многих модах строка с хешем может занимать больше места, чем размер остальных свойств в аккаунте (деньги, уровень, ID банды/организации, etc.) вместе взятых.
    • Кроме экономии памяти, уменьшатся требования и к дисковому пространству на хостинге, т.к. данные аккаунтов будут занимать меньше места, будучи сохранёнными на диске (как в отдельных файлах, так и в БД).
      Также уменьшится размер скрипта в скомпилированном виде (AMX).
    • Как я говорил ранее, функция была сделана больше года назад, поэтому она не привязана к строкам из 64 символов от SHA256_PassHash и может обрабатывать строки другой длины от прочих алгоритмов (SHA-512, например).

    Код:
    PHP код:
    /**
    * Коды ошибок, возвращаемые функцией PackHash.
    **/
    enum PHResult
    {
        
    PH_OK = -1,
        
    PH_ERR_INVALID_HASH,
        
    PH_ERR_NOT_ENOUGH_CELLS
    };

    /**
    * Описания ошибок.
    * Пример использования:
    *   new PHResult:ph_result = PackHash(hash_string, packed_hash);
    *   if (ph_result != PH_OK)
    *     printf("PackHash -> ошибка: %s.", pack_hash_error_strings[ph_result]);
    **/
    stock const pack_hash_error_strings[PHResult][] =
    {
        
    "неправильный хеш",
        
    "недостаточно ячеек для хранения упакованного хеша"
    };

    /**
    * PackHash
    * Упаковывает строку с хеш-суммой.
    **/
    PHResult:PackHash(hash[], cells[], hash_size sizeof(hash), cells_number sizeof(cells))
    /* by Daniel_Cortez (http://pro-pawn.ru/showthread.php?12507-PackHash) */
        
    new 0cellbits0t;
        
    cells[0] = 0;
        for (; ; )
        {
            
    hash[i];
            switch (
    t)
            {
                case 
    '0' .. '9':
                    
    '0';
                case 
    'A' .. 'F':
                    
    'A' 10;
                case 
    'a' .. 'f':
                    
    'a' 10;
                default:
                    return 
    PH_ERR_INVALID_HASH;
            }
            
    cells[n] = (cells[n] << 4) | t;
            if(++
    == hash_size)
                break;
            if ((
    -= 4) == 0)
                if (++
    == cells_number)
                    return (
    hash[i] == EOS) ? PH_OK PH_ERR_NOT_ENOUGH_CELLS;
                else
                    
    cellbitscells[n] = 0;
        }
        for (; ++
    <= cells_number; )
            
    cells[n] = 0;
        return 
    PH_OK;

    Пример использования:
    PHP код:
    /**
    * CheckPassword
    * Проверяет правильность введённого игроком пароля.
    *     password[] - введённый пароль
    *     salt[] - соль, использовавшаяся при хешировании пароля игрока при регистрации или последней смене пароля
    *     expected_packed_hash[] - массив с упаковынным хешем, сохранённым в аккаунте игрока
    *     ph_size - размер массива с упакованным хэшем (необязательный параметр)
    **/
    bool:CheckPassword(password[], salt[], expected_packed_hash[], ph_size sizeof(packed_hash))
    {
        new 
    hash[64 1];
        
    SHA256_PassHash(passwordsalthashsizeof(hash));
        new 
    packed_hash[(sizeof(hash) - 1) / (cellbits charbits 2)];
        if(
    PH_OK != PackHash(hashpacked_hash))
            return 
    false;
        for(new 
    0sizeof(packed_hash); ++i)
            if(
    packed_hash[i] != expected_packed_hash[i])
                return 
    false;
        return 
    true;

    См. также:

    Автор: Daniel_Cortez

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 7 пользователя(ей) сказали cпасибо:
    $continue$ (24.07.2015)DeimoS (08.02.2016)Londlem (24.07.2015)Osetin (24.07.2015)Smile (15.08.2015)Snoop_Dog (24.07.2015)[ForD] (25.07.2015)
  3. #2
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,441
    Репутация:
    261 ±
    Возможно стоило сделать кликобельную ссылку, "из коробки"
    Просто не все могут понять, что такое из коробки

  4. #3
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,663
    Репутация:
    2145 ±
    Цитата Сообщение от Bublik_Public Посмотреть сообщение
    Возможно стоило сделать кликобельную ссылку, "из коробки"
    Просто не все могут понять, что такое из коробки
    Сделал (а заодно и перенёс твоё сообщение, по ошибке оставленное в теме с SHA256_PassHash).
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  5. #4
    Аватар для #ball
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Rostov-on-Don
    Сообщений
    120
    Репутация:
    14 ±
    В чем может быть проблема?!
    PHP код:
    PackHashResult:PackHash(hash[], cells[], hash_size sizeof(hash), cells_number sizeof(cells))
    /* by Daniel_Cortez (http://pro-pawn.ru/showthread.php?12507-PackHash) */
        
    new 0cellbits0t;
        
    cells[0] = 0;
        for (; ; )
        {
            
    hash[i];
            switch (
    t)
            {
                case 
    '0' .. '9':
                    
    '0';
                case 
    'A' .. 'F':
                    
    'A' 10;
                case 
    'a' .. 'f':
                    
    'a' 10;
                default:
                    return 
    PH_ERR_INVALID_HASH;//tag mismatch
            
    }
            
    cells[n] = (cells[n] << 4) | t;
            if(++
    == hash_size)
                break;
            if ((
    -= 4) == 0)
                if (++
    == cells_number)
                    return (
    hash[i] == EOS) ? PH_OK PH_ERR_NOT_ENOUGH_CELLS;//tag mismatch
                
    else
                    
    cellbitscells[n] = 0;
        }
        for (; ++
    <= cells_number; )
            
    cells[n] = 0;
        return 
    PH_OK;//tag mismatch

    Упаковка правильная?!
    PHP код:
    new hash[64 1];
    SHA256_PassHash(inputtextsalthashsizeof(hash));
    PackHash(hashpInfo[playerid][Password]); 

  6. Пользователь сказал cпасибо:
    Daniel_Cortez (16.08.2015)
  7. #5
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,663
    Репутация:
    2145 ±
    Сначала я планировал назвать перечисление (enum) с константами ошибок именно PackHashResult, но потом решил поменять на PHResult, чтобы не приходилось много печатать. Видимо, не везде заменил.
    Ок, исправил ошибку. Спасибо, что сообщили.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •