• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Мануал Хеширование паролей

kick

Магистр Йода
Administrator
За веру и верность форуму
Отец-основатель
Сообщения
7 241
Розыгрыши
28
Решения
2
Репутация
6 234
Реакции
7 566
Баллы
2 718
PHP
PHP:
function encrypt($str)   {
  $key = array();
  $dst = array();
  $i = 0;
  $nBytes = strlen($str);
  while ($i < $nBytes)
   {
    $i++;
    $key[$i] = ord(substr($str, $i - 1, 1));
    $dst[$i] = $key[$i];
   }  
  $rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
  $one = $rslt * 213119 + 2529077;
  $one = $one - intval($one/ 4294967296) * 4294967296;


  $rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
  $two = $rslt * 213247 + 2529089;
  $two = $two - intval($two/ 4294967296) * 4294967296;


  $rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
  $three = $rslt * 213203 + 2529589;
  $three = $three - intval($three/ 4294967296) * 4294967296;


  $rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
  $four = $rslt * 213821 + 2529997;
  $four = $four - intval($four/ 4294967296) * 4294967296;


  $key[4] = intval($one/16777216);        
  $key[3] = intval(($one - $key[4] * 16777216) / 65535);
  $key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
  $key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));


  $key[8] = intval($two/16777216);    
  $key[7] = intval(($two - $key[8] * 16777216) / 65535);
  $key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
  $key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));


  $key[12] = intval($three/16777216);    
  $key[11] = intval(($three - $key[12] * 16777216) / 65535);
  $key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
  $key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));


  $key[16] = intval($four/16777216);    
  $key[15] = intval(($four - $key[16] * 16777216) / 65535);
  $key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
  $key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));


  $dst[1] = $dst[1] ^ $key[1];


  $i=1;
  while ($i<16)
   {
    $i++;
    $dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
   }


  $i=0;
  while ($i<16)
   {
    $i++;
    if ($dst[$i] == 0)
     {
      $dst[$i] = 102;
     }
   }


  $encrypt = "0x";
  $i=0;


  while ($i<16)
   {
    $i++;
    if ($dst[$i] < 16)
     {
      $encrypt = $encrypt . "0" . dechex($dst[$i]);
     }
    else
     {
      $encrypt = $encrypt . dechex($dst[$i]);
     }
   }
  return $encrypt;
}

C#
Код:
// unsigned 32 bit integer (dword) #if defined(_MSC_VER) && !defined(uint32_t)
#if (_MSC_VER < 1300)
typedef unsigned int      uint32_t;
#else
typedef unsigned __int32  uint32_t;
#endif
#else
#include <stdint.h>
#endif


const int hash_skeys[4][2] = {
    { 213119, 2529077 },
    { 213247, 2529089 },
    { 213203, 2529589 },
    { 213821, 2529997 }
};
const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
void encrypt(char *src, char *dst)
{
    int i = 0, j = 0;
    char key[0x10];
    char buff[0x10];
    char hexbuff[0x21];


    uint32_t* key_dwords = (uint32_t*)key;


    memset(&key, 0, sizeof(key));
    memset(&buff, 0, sizeof(buff));
    memset(&hexbuff, 0, sizeof(hexbuff));


    strncpy(key, src, sizeof(key));
    strncpy(buff, src, sizeof(buff));


    for(i = 0; i < 4; i++)
        key_dwords = key_dwords * hash_skeys[0] + hash_skeys[1];


    buff[0] = buff[0] ^ key[0];
    for(i = 1; i < 0x10; i++)
        buff = buff ^ buff[i-1] ^ key;
    
    for(i = 0; i < 0x10; i++) {
        j = buff != 0 ? buff : 102;
        hexbuff[i*2] = hex_digit[j >> 4 & 0x0f];
        hexbuff[i*2 + 1] = hex_digit[j & 0x0f];
    }


    //hexbuff[0x20] = 0;
    sprintf(dst, "0x%s", hexbuff);
}
JS
Код:
function pwdcrypt(str){
    var key = new Array();
    var dst = new Array();
  
    for (var i = 0; i < str.length; i++)
    {
        key = str.charCodeAt(i);
        dst = key;
    }
  
    var hash_keys = new Array(4);
    for (var i = 0; i < 4; i++)
    {
        hash_keys = new Array(2);
    }
  
    hash_keys[0][0] = 213119; hash_keys[0][1] = 2529077;
    hash_keys[1][0] = 213247; hash_keys[1][1] = 2529089;
    hash_keys[2][0] = 213203; hash_keys[2][1] = 2529589;
    hash_keys[3][0] = 213821; hash_keys[3][1] = 2529997;


    var msum = function (m, n)
    {
        return (((((m & 0xffff0000) * n[0]) >>> 0) + (((m & 0x0000ffff) * n[0]) >>> 0)) + n[1]) >>> 0;
    };


    for (var i = 0; i < 16; i += 4)
    {
        var dw = 0;
      
        for (var j = 0; j < 4; j++)
        {
            dw += key[i + j] << j * 8;
        }
      
        var tmp = msum(dw, hash_keys[Math.floor(i / 4)]);
        key[i + 3] = (tmp >> 24) & 0xFF;
        key[i + 2] = ((tmp - ((key[i + 3] << 24) & 0xFF000000)) >> 16) & 0xFF;
        key[i + 1] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16)) >> 8) & 0xFF;
        key[i + 0] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16) & 0xFF - (key[i + 1] << 8) & 0xFF));
    }
  
    dst[0] = dst[0] ^ key[0];


    for (var i = 1; i < 16; i++)
    {
        dst = dst ^ dst[i - 1] ^ key;
    }


    for (var i = 0; i < 16; i++)
    {
        if (dst == 0)
        {
            dst = 102;
        }
    }


    var e = "0x";
    for (var i = 0; i < 16; i++)
    {
        if (dst < 16)
        {
            e += "0";
        }
        e += parseInt(dst[i], 10).toString(16);
    }
    return e;
}
 
Извиняюсь заранее может за некропостинг, но помогите понять:

Наверху функции мы формируем массив, в зависимости от длинны строки:

$nBytes = strlen($str);

while ($i < $nBytes) {
$i++;
$key[$i] = ord(substr($str, $i - 1, 1));
$dst[$i] = $key[$i];
}

Массив $key заполнится значениями, если пароль в длинну - 8 символов, то максимальным индексом будет 8

Ниже по коду мы обращаемся к конкретному индексу массива

$rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
$three = $rslt * 213203 + 2529589;
$three = $three - intval($three/ 4294967296) * 4294967296;

Это вызывает ошибку, так как $key с индексом, например, 10 не существует

1692464200399.png
 
What is the code for password hashing in C++?
 
 
Thank you very much, but unfortunately I did not find the hash I need in [L2 PTS C1] sources.
 
Если кому актуально , разве что на javascript не написал =)

И на javascript тоже написал =D
 
PHP
PHP:
function encrypt($str)   {
  $key = array();
  $dst = array();
  $i = 0;
  $nBytes = strlen($str);
  while ($i < $nBytes)
   {
    $i++;
    $key[$i] = ord(substr($str, $i - 1, 1));
    $dst[$i] = $key[$i];
   } 
  $rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
  $one = $rslt * 213119 + 2529077;
  $one = $one - intval($one/ 4294967296) * 4294967296;


  $rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
  $two = $rslt * 213247 + 2529089;
  $two = $two - intval($two/ 4294967296) * 4294967296;


  $rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
  $three = $rslt * 213203 + 2529589;
  $three = $three - intval($three/ 4294967296) * 4294967296;


  $rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
  $four = $rslt * 213821 + 2529997;
  $four = $four - intval($four/ 4294967296) * 4294967296;


  $key[4] = intval($one/16777216);       
  $key[3] = intval(($one - $key[4] * 16777216) / 65535);
  $key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
  $key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));


  $key[8] = intval($two/16777216);   
  $key[7] = intval(($two - $key[8] * 16777216) / 65535);
  $key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
  $key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));


  $key[12] = intval($three/16777216);   
  $key[11] = intval(($three - $key[12] * 16777216) / 65535);
  $key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
  $key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));


  $key[16] = intval($four/16777216);   
  $key[15] = intval(($four - $key[16] * 16777216) / 65535);
  $key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
  $key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));


  $dst[1] = $dst[1] ^ $key[1];


  $i=1;
  while ($i<16)
   {
    $i++;
    $dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
   }


  $i=0;
  while ($i<16)
   {
    $i++;
    if ($dst[$i] == 0)
     {
      $dst[$i] = 102;
     }
   }


  $encrypt = "0x";
  $i=0;


  while ($i<16)
   {
    $i++;
    if ($dst[$i] < 16)
     {
      $encrypt = $encrypt . "0" . dechex($dst[$i]);
     }
    else
     {
      $encrypt = $encrypt . dechex($dst[$i]);
     }
   }
  return $encrypt;
}

C#
Код:
// unsigned 32 bit integer (dword) #if defined(_MSC_VER) && !defined(uint32_t)
#if (_MSC_VER < 1300)
typedef unsigned int      uint32_t;
#else
typedef unsigned __int32  uint32_t;
#endif
#else
#include <stdint.h>
#endif


const int hash_skeys[4][2] = {
    { 213119, 2529077 },
    { 213247, 2529089 },
    { 213203, 2529589 },
    { 213821, 2529997 }
};
const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
void encrypt(char *src, char *dst)
{
    int i = 0, j = 0;
    char key[0x10];
    char buff[0x10];
    char hexbuff[0x21];


    uint32_t* key_dwords = (uint32_t*)key;


    memset(&key, 0, sizeof(key));
    memset(&buff, 0, sizeof(buff));
    memset(&hexbuff, 0, sizeof(hexbuff));


    strncpy(key, src, sizeof(key));
    strncpy(buff, src, sizeof(buff));


    for(i = 0; i < 4; i++)
        key_dwords = key_dwords * hash_skeys[0] + hash_skeys[1];


    buff[0] = buff[0] ^ key[0];
    for(i = 1; i < 0x10; i++)
        buff = buff ^ buff[i-1] ^ key;
   
    for(i = 0; i < 0x10; i++) {
        j = buff != 0 ? buff : 102;
        hexbuff[i*2] = hex_digit[j >> 4 & 0x0f];
        hexbuff[i*2 + 1] = hex_digit[j & 0x0f];
    }


    //hexbuff[0x20] = 0;
    sprintf(dst, "0x%s", hexbuff);
}
JS
Код:
function pwdcrypt(str){
    var key = new Array();
    var dst = new Array();
 
    for (var i = 0; i < str.length; i++)
    {
        key = str.charCodeAt(i);
        dst = key;
    }
 
    var hash_keys = new Array(4);
    for (var i = 0; i < 4; i++)
    {
        hash_keys = new Array(2);
    }
 
    hash_keys[0][0] = 213119; hash_keys[0][1] = 2529077;
    hash_keys[1][0] = 213247; hash_keys[1][1] = 2529089;
    hash_keys[2][0] = 213203; hash_keys[2][1] = 2529589;
    hash_keys[3][0] = 213821; hash_keys[3][1] = 2529997;


    var msum = function (m, n)
    {
        return (((((m & 0xffff0000) * n[0]) >>> 0) + (((m & 0x0000ffff) * n[0]) >>> 0)) + n[1]) >>> 0;
    };


    for (var i = 0; i < 16; i += 4)
    {
        var dw = 0;
     
        for (var j = 0; j < 4; j++)
        {
            dw += key[i + j] << j * 8;
        }
     
        var tmp = msum(dw, hash_keys[Math.floor(i / 4)]);
        key[i + 3] = (tmp >> 24) & 0xFF;
        key[i + 2] = ((tmp - ((key[i + 3] << 24) & 0xFF000000)) >> 16) & 0xFF;
        key[i + 1] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16)) >> 8) & 0xFF;
        key[i + 0] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16) & 0xFF - (key[i + 1] << 8) & 0xFF));
    }
 
    dst[0] = dst[0] ^ key[0];


    for (var i = 1; i < 16; i++)
    {
        dst = dst ^ dst[i - 1] ^ key;
    }


    for (var i = 0; i < 16; i++)
    {
        if (dst == 0)
        {
            dst = 102;
        }
    }


    var e = "0x";
    for (var i = 0; i < 16; i++)
    {
        if (dst < 16)
        {
            e += "0";
        }
        e += parseInt(dst[i], 10).toString(16);
    }
    return e;
}
Мне указали, что мой комментарий — флуд. Я загуглил, «флуд» — это сообщения, не несущие полезной информации. Принимаю замечание, исправляюсь.
Хочу аргументированно повторить свою мысль: в PHP нет практического смысла писать собственную функцию для хеширования паролей. Начиная с версии 5.5.0 в языке существует встроенная функция password_hash().
Её ключевые преимущества:
  1. Она использует стойкие криптографические алгоритмы (по умолчанию bcrypt).
  2. Она необратима (что и требуется от хеша пароля).
  3. Она автоматически генерирует и применяет соль (salt), что защищает от атак по радужным таблицам.
  4. Для проверки пароля предусмотрена парная функция password_verify(), которая делает сравнение безопасным.
Писать свою реализацию не только излишне, но и опасно, так как легко допустить ошибки в безопасности. Рекомендую всегда использовать password_hash()
 
molxs, серьезно? Не надо здесь умничать и казаться, каким якобы умным. Это функция специально написана для сборки, которое именно так и работает. Алгоритм не будет работать с сборкой, и не надо рассказывать о PHP здесь. Ну и раз гуглите
1770570408225.webp
Она использует стойкие криптографические алгоритмы (по умолчанию bcrypt).
Какие? Кого? Что? Смешно, а то что на самом PHP даже указано, что используйте argon2 и его модификации и примечание
При хешировании пароля алгоритмом PASSWORD_BCRYPT значение аргумента password усекается до предельной длины — 72 байтов.
Она автоматически генерирует и применяет соль (salt), что защищает от атак по радужным таблицам.
  • Опция salt устарела в пользу соли по умолчанию, которую функция генерирует автоматически. Начиная с PHP 8.0.0 функция игнорирует пользовательскую соль.
Создавать аккаунты в сборке любым из этим алгоритмом = не зайти в аккаунт на сервер, потому что оно сгенерировано таким алгоритмом, которым не является стандартным алгоритмом вообще, и не надо путать хеширование и симметричную обфускацию, которая используется в этих сборках десятилетиями.
Вывод, что сообщение "В php есть по дефолту готовый метод для хэширования паролей) Зачем что-то усложнять?) password_hash загуглите", не несёт смысловой нагрузки, как и бесполезность совета, кроме +1 к счётчику сообщения не нёсет, как и тот бред, что нет смысла, ну да нет смысла заходить с клиента на сервер тоже, ведь какая разница сможет ли авторизоваться на сервере игрок или нет. Ну и в придачу
10. Запрещено публичное обсуждение действий команды форума, неконструктивная критика проекта, обсуждение блокировок, а так же написание сообщений от заблокированных участников сообщества. Также запрещено выпрашивать снятие нарушения/блокировки. Если Вам единожды отказали - в следующий раз вы рискуете отправиться в перманентную блокировку.
 
molxs, серьезно? Не надо здесь умничать и казаться, каким якобы умным. Это функция специально написана для сборки, которое именно так и работает. Алгоритм не будет работать с сборкой, и не надо рассказывать о PHP здесь. Ну и раз гуглите
Посмотреть вложение 93475

Какие? Кого? Что? Смешно, а то что на самом PHP даже указано, что используйте argon2 и его модификации и примечание
При хешировании пароля алгоритмом PASSWORD_BCRYPT значение аргумента password усекается до предельной длины — 72 байтов.

  • Опция salt устарела в пользу соли по умолчанию, которую функция генерирует автоматически. Начиная с PHP 8.0.0 функция игнорирует пользовательскую соль.
Создавать аккаунты в сборке любым из этим алгоритмом = не зайти в аккаунт на сервер, потому что оно сгенерировано таким алгоритмом, которым не является стандартным алгоритмом вообще, и не надо путать хеширование и симметричную обфускацию, которая используется в этих сборках десятилетиями.
Вывод, что сообщение "В php есть по дефолту готовый метод для хэширования паролей) Зачем что-то усложнять?) password_hash загуглите", не несёт смысловой нагрузки, как и бесполезность совета, кроме +1 к счётчику сообщения не нёсет, как и тот бред, что нет смысла, ну да нет смысла заходить с клиента на сервер тоже, ведь какая разница сможет ли авторизоваться на сервере игрок или нет. Ну и в придачу
Тема называлась хэширование паролей, и как понять мне было что это хэширование вы применяете для на сервер? Я разве не по теме дал комментарий? Все сказал по делу, вы сейчас дополнили подробности для чего именно вы используете свой алгоритм. А что про соль неверно?? она с версии 7 была как диприкейт, а с 8 по умолчанию сама и генерирует, как я сказал сразу. Ну спасибо что пояснили. Я же действительно не знал что вы используете потом при входе на сервер данный метод. И зачем сразу бочки катить? Не надо так )
 
Назад
Сверху Снизу