PDA

Просмотр полной версии : [Вопрос] Шифрование паролей



Быдлокодер
17.04.2016, 23:06
Здраствуйте, прикручиваю UCP к серверу, и мне нужно убрать шифрование паролей (плагин whirlpool)
Останусь от всей души благодарен!


АСТАРОЖНА!! АХТУНГ!! МНОГА КОДА!!

SQL_AttemptLogin(playerid, const password[])
{
new
query[300],
buffer[129];

WP_Hash(buffer, sizeof(buffer), password);

format(query, sizeof(query), "SELECT `ID` FROM `accounts` WHERE `Username` = '%s' AND `Password` = '%s'", PlayerData[playerid][pUsername], buffer);
mysql_tquery(g_iHandle, query, "OnQueryFinished", "dd", playerid, THREAD_LOGIN);
}

//////////////////////////////////////////////////////////
Dialog:NewPass(playerid, response, listitem, inputtext[])
{
if (response)
{
if (isnull(inputtext))
return Dialog_Show(playerid, NewPass, DIALOG_STYLE_PASSWORD, "Ââåäè íîâèé ïàðîëü", "Áóäü ëàñêà, ââåäè íîâèé ïàðîëü.\n\nÇàì³òêà: Áóäü ëàñêà, âèêîðèñòîâóé ñêëàäíèé, áåçïå÷íèé ïàðîëü.", "Çì³íèòè", "³äì³íà");

static
buffer[129],
query[256];

WP_Hash(buffer, sizeof(buffer), inputtext);
inputtext[0] = '\0';

format(query, sizeof(query), "UPDATE `accounts` SET `Password` = '%s' WHERE `Username` = '%s'", buffer, PlayerData[playerid][pUsername]);
mysql_tquery(g_iHandle, query);

SendServerMessage(playerid, "Òè çì³íèâ ñâ³é ïàðîëü.");
}
return 1;
}

/////////////////////////////////////////////////////////////////////
Dialog:ChangePassword(playerid, response, listitem, inputtext[])
{
if (response)
{
if (isnull(inputtext))
return cmd_changepass(playerid, "\1");

static
buffer[129],
query[256];

WP_Hash(buffer, sizeof(buffer), inputtext);
inputtext[0] = '\0';

format(query, sizeof(query), "SELECT `Password` FROM `accounts` WHERE `Username` = '%s' AND `Password` = '%s'", PlayerData[playerid][pUsername], buffer);
mysql_tquery(g_iHandle, query, "OnQueryFinished", "dd", playerid, THREAD_VERIFY_PASS);
}
return 1;
}


И вот, native

native WP_Hash(buffer[], len, const str[]);

L0ndl3m
17.04.2016, 23:13
Когда же вы запомните, что шифрование и хеширование это разные вещи?

По теме: вам не понадобится массив "buffer" и функция "WP_Hash". Вместо массива "buffer" теперь используйте "inputtext". А также не нужно "очищать" inputtext.

TheMallard
18.04.2016, 05:25
А еще лучше не убирать, а заменить на SHA256!

Daniel_Cortez
18.04.2016, 06:10
В базе уже есть аккаунты? Если да, то, как уже предложили выше, можно инициировать переход на SHA-256 (в чём вообще профит хранить пароли в чистом виде?): добавляете в БД ещё одно поле для хеша SHA-256, но поле со старым хешем не удаляете. При авторизации введённый игроком пароль сверяется с SHA-256, если он верный - пароль (в исходном виде, естественно) шифруется с помощью Whirlpool и записывается в новое поле в аккаунте.
Спустя некоторое время поле с SHA-256 удаляете, а пароль сверяете с хешом Whirlpool. Те же аккаунты, которые не застали момента перехода с SHA-256 на Whirlpool либо удаляете за неактив, либо перемещаете их в отдельную таблицу, где ещё есть поле с SHA-256 и восстанавливаете вручную по заявкам.

Быдлокодер
18.04.2016, 16:16
Аккаунтов ещё нет, что делать в этом случае ?
Можете показать на примере (коде) ?

Спасибо! :acute:

Daniel_Cortez
18.04.2016, 18:31
Аккаунтов ещё нет, что делать в этом случае ?
Можете показать на примере (коде) ?

Спасибо! :acute:
А что показывать-то? Если аккаунтов нет, то достаточно просто убрать вызов WP_Hash. Всё.

Быдлокодер
18.04.2016, 18:47
Убрал вызов, ошибки:


C:\Documents and Settings\Admin-PC\Ìîè äîêóìåíòû\\mod\gamemodes\roleplay.pwn(1709) : error 017: undefined symbol "inputtext"
C:\Documents and Settings\Admin-PC\Ìîè äîêóìåíòû\\mod\gamemodes\roleplay.pwn(1706) : warning 203: symbol is never used: "password"
C:\Documents and Settings\Admin-PC\Ìîè äîêóìåíòû\s\mod\gamemodes\roleplay.pwn(1724) : error 017: undefined symbol "buffer"
C:\Documents and Settings\Admin-PC\Ìîè äîêóìåíòû\\mod\gamemodes\roleplay.pwn(1721) : warning 203: symbol is never used: "password"
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
2 Errors.


Строки:
1706:
SQL_CreateAccount(const username[], const password[])
1709:
format(query, sizeof(query), "INSERT INTO `accounts` (`Username`, `Password`, `RegisterDate`, `LoginDate`) VALUES('%s', '%s', '%s', '%s')", username, inputtext, ReturnDate(), ReturnDate());
1721:
SQL_AttemptLogin(playerid, const password[])
1724:
format(query, sizeof(query), "SELECT `ID` FROM `accounts` WHERE `Username` = '%s' AND `Password` = '%s'", PlayerData[playerid][pUsername], buffer);

L0ndl3m
18.04.2016, 19:19
Заново код весь показывайте.

Быдлокодер
18.04.2016, 19:26
Вот:

Dialog:NewPass(playerid, response, listitem, inputtext[])
{
if (response)
{
if (isnull(inputtext))
return Dialog_Show(playerid, NewPass, DIALOG_STYLE_PASSWORD, "Ââåäè íîâèé ïàðîëü", "Áóäü ëàñêà, ââåäè íîâèé ïàðîëü.\n\nÇàì³òêà: Áóäü ëàñêà, âèêîðèñòîâóé ñêëàäíèé, áåçïå÷íèé ïàðîëü.", "Çì³íèòè", "³äì³íà");

static
buffer[129],
query[256];

inputtext[0] = '\0';

format(query, sizeof(query), "UPDATE `accounts` SET `Password` = '%s' WHERE `Username` = '%s'", buffer, PlayerData[playerid][pUsername]);
mysql_tquery(g_iHandle, query);

SendServerMessage(playerid, "Òè çì³íèâ ñâ³é ïàðîëü.");
}
return 1;
}

Dialog:ChangePassword(playerid, response, listitem, inputtext[])
{
if (response)
{
if (isnull(inputtext))
return cmd_changepass(playerid, "\1");

static
buffer[129],
query[256];

inputtext[0] = '\0';

format(query, sizeof(query), "SELECT `Password` FROM `accounts` WHERE `Username` = '%s' AND `Password` = '%s'", PlayerData[playerid][pUsername], buffer);
mysql_tquery(g_iHandle, query, "OnQueryFinished", "dd", playerid, THREAD_VERIFY_PASS);
}
return 1;
}
И вот:


SQL_CreateAccount(const username[], const password[])
{
new query[512];
format(query, sizeof(query), "INSERT INTO `accounts` (`Username`, `Password`, `RegisterDate`, `LoginDate`) VALUES('%s', '%s', '%s', '%s')", username, inputtext, ReturnDate(), ReturnDate());
mysql_tquery(g_iHandle, query);
}

SQL_CheckAccount(playerid)
{
new query[128];

format(query, sizeof(query), "SELECT `Username` FROM `characters` WHERE `Character` = '%s'", ReturnName(playerid));
mysql_tquery(g_iHandle, query, "OnQueryFinished", "dd", playerid, THREAD_FIND_USERNAME);
}

SQL_AttemptLogin(playerid, const password[])
{
new query[300];
format(query, sizeof(query), "SELECT `ID` FROM `accounts` WHERE `Username` = '%s' AND `Password` = '%s'", PlayerData[playerid][pUsername], buffer);
mysql_tquery(g_iHandle, query, "OnQueryFinished", "dd", playerid, THREAD_LOGIN);
}

Спасибо!

L0ndl3m
18.04.2016, 21:11
Массив "buffer" - не нужен. Я писал же об этом.
И это:

inputtext[0] = '\0';
- не нужно.

Быдлокодер
18.04.2016, 21:33
Londlem
Daniel_Cortez
Спасибо!
тему можно закрывать.