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

Тема: md5_hash

  1. #1
    Аватар для AMD
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.03.2016
    Сообщений
    5
    Репутация:
    0 ±

    md5_hash

    Здравствуйте. Возникла проблемка:

    В создании аккаунта добавил md5_hash

    Код:
    stock CreateNewAccount(playerid, password[])
    {
        new query_string[512];
        format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`Player_Name`, `Password`, `Admin`, `Cash`, `Skin`, `Ban`) VALUES ('%s', '%s', '0', '0', '0', '0')",
    	pInfo[playerid][pName], MD5_Hash(MD5_Hash(password)));
        mysql_function_query(mID, query_string, false, "", "");
        return 1;
    }
    Пароли шифрует без вопросов. Проблема в том, что при авторизации он их не расшифровывает.

    Код:
    if(!strcmp(pInfo[playerid][pPassword], inputtext))
                
    			//MD5_Hash(MD5_Hash(password))
                {
                	new query_string[52+MAX_PLAYER_NAME];
        			format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
        			mysql_function_query(mID, query_string, true, "UploadPlayerAccount","i", playerid);
                }
                else ErrorDialogMessage(playerid, dLogin, 2);
                return 1;
    Пробовал разными способами:

    Код:
    if(!strcmp(MD5_Hash(MD5_Hash(pInfo[playerid][pPassword])), inputtext))
    Потом так:

    Код:
    format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s' AND `Password` = '%s'", pInfo[playerid][pName], MD5_Hash(MD5_Hash(pInfo[playerid][pPassword])));
    Кто поможет решить данный вопрос?

  2. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    1. Уже небезопасно хешировать пароли с помощью алгоритма md5, используйте новую функцию в pawn - SHA256_PassHash (кэшированная версия).
    2. Нельзя расшифровать пароль (не говоря о сайтах).
    3.1. Как вы получаете значение pInfo[playerid][pPassword].
    3.2.
    PHP код:
    if(!strcmp(MD5_Hash(MD5_Hash(pInfo[playerid][pPassword])), inputtext)) 
    Зачем вы хешируете пароль ещё раз? Как минимум, если думать логически, вы должны захешировать inputtext, а после - сравнить.
    Тоже самое:
    PHP код:
    format(query_stringsizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s' AND `Password` = '%s'"pInfo[playerid][pName], MD5_Hash(MD5_Hash(pInfo[playerid][pPassword]))); 
    Последний раз редактировалось VVWVV; 18.03.2016 в 00:16.

  3. #3
    Аватар для AMD
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.03.2016
    Сообщений
    5
    Репутация:
    0 ±
    Советовали юзать двойное хеширование.
    SHA256_PassHash выпущен с 0.3.7, а сервер у меня 0.3e версии.

    То есть, вы предполагаете делать так?
    Код:
    if(strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
    Последний раз редактировалось AMD; 18.03.2016 в 01:10.

  4. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от AMD Посмотреть сообщение
    Советовали юзать двойное хеширование.
    А SHA256_PassHash выпущен с 0.3.7, а сервер у меня 0.3e версии.

    То есть, вы предполагаете делать так?
    Код:
    if(strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
    Да, ибо в pInfo[playerid][pPassword] уже загружен захешированный пароль из базы данных.

    P.S. используйте Соль.
    Последний раз редактировалось VVWVV; 18.03.2016 в 01:10.

  5. Пользователь сказал cпасибо:
    AMD (18.03.2016)
  6. #5
    Аватар для AMD
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.03.2016
    Сообщений
    5
    Репутация:
    0 ±
    Забил данную проверку, пароль ни хешированный ни какой не принимает.
    Если пробовать так:
    Код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
    Будет:
    warning 213: tag mismatch

  7. #6
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от AMD Посмотреть сообщение
    Забил данную проверку, пароль ни хешированный ни какой не принимает.
    Если пробовать так:
    Код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
    Будет:
    warning 213: tag mismatch
    PHP код:
    if(strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0
    тоже самое:
    PHP код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword])) 

  8. Пользователь сказал cпасибо:
    AMD (18.03.2016)
  9. #7
    Аватар для AMD
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.03.2016
    Сообщений
    5
    Репутация:
    0 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    PHP код:
    if(strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0
    тоже самое:
    PHP код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword])) 
    Всё, вопрос улажен.
    Только в данной проверке.
    Код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]))
    ! лишний.

    - - - Добавлено - - -

    Казалось бы, но нет.

    Теперь можно водить абсолютно любые пароли.

  10. #8
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от AMD Посмотреть сообщение
    Всё, вопрос улажен.
    Только в данной проверке.
    Код:
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]))
    ! лишний.

    - - - Добавлено - - -

    Казалось бы, но нет.

    Теперь можно водить абсолютно любые пароли.
    Нет. Если строки совпали, то функция strcmp возвращает нуль. Соответственно, знак ! очень нужен.

    На wiki.sa-mp.com написано:
    Return Values:
    0 if strings match each other on given length;
    1 o r -1 if some character do not match: string1[i] - string2[i] ('i' represents character index starting from 0);
    difference in number of characters if one string matches only part of another string.
    Лучше используйте так:
    PHP код:
    if(strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
    {
        
    /* Если строки совпали */

    Последний раз редактировалось VVWVV; 18.03.2016 в 01:33.

  11. #9
    Аватар для AMD
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.03.2016
    Сообщений
    5
    Репутация:
    0 ±
    PHP код:
    case dLogin:
            {
                if(!
    response)
                {
                    
    SPD(playeriddLoginDSM"Оповещение""{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат""Вход""Выход");
                    return 
    Kick(playerid);
                }
                if(!
    strlen(inputtext)) return ErrorDialogMessage(playeriddLogin0);
                for(new 
    strlen(inputtext)-1!= -1i--)
                {
                    switch(
    inputtext[i])
                    {
                        case 
    '0'..'9''а'..'я''a'..'z''А'..'Я''A'..'Z': continue;
                        default: return 
    ErrorDialogMessage(playeriddLogin1);
                    }
                }
                if(
    strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
                {
                    new 
    query_string[52+MAX_PLAYER_NAME];
                    
    format(query_stringsizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'"pInfo[playerid][pName]);
                    
    mysql_function_query(mIDquery_stringtrue"UploadPlayerAccount","i"playerid);
                }
                return 
    ErrorDialogMessage(playeriddLogin2);
            } 
    Так и сделано,в итоге принимать пароль никакой не хочет.

  12. #10
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от AMD Посмотреть сообщение
    PHP код:
    case dLogin:
            {
                if(!
    response)
                {
                    
    SPD(playeriddLoginDSM"Оповещение""{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат""Вход""Выход");
                    return 
    Kick(playerid);
                }
                if(!
    strlen(inputtext)) return ErrorDialogMessage(playeriddLogin0);
                for(new 
    strlen(inputtext)-1!= -1i--)
                {
                    switch(
    inputtext[i])
                    {
                        case 
    '0'..'9''а'..'я''a'..'z''А'..'Я''A'..'Z': continue;
                        default: return 
    ErrorDialogMessage(playeriddLogin1);
                    }
                }
                if(
    strcmp(MD5_Hash(MD5_Hash(inputtext)), pInfo[playerid][pPassword]) == 0)
                {
                    new 
    query_string[52+MAX_PLAYER_NAME];
                    
    format(query_stringsizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'"pInfo[playerid][pName]);
                    
    mysql_function_query(mIDquery_stringtrue"UploadPlayerAccount","i"playerid);
                }
                return 
    ErrorDialogMessage(playeriddLogin2);
            } 
    Так и сделано,в итоге принимать пароль никакой не хочет.
    Я думал, что у вас это все в отдельной функции (паблике). Теперь всё понятно, у вас не загружено значение из базы данных в массив (pInfo[playerid][pPassword]), из-за этого ошибка.

    UPD:
    Это вам не mxINI.

    PHP код:
    public
        
    OnPlayerConnect(playerid)
    {

        new 
    query_string[52+MAX_PLAYER_NAME];
        
    mysql_format(mIDquery_stringsizeof query_string"SELECT * FROM `accounts` WHERE `player_name` = '%s' LIMIT 1"pInfo[playerid][pName]);
        
    mysql_tquery(mIDquery_string"OnAccountResponse""i"playerid);
    }

    forward OnAccountResponse(playerid);
    public 
    OnAccountResponse(playerid)
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields);
        if (
    rows)
        {
            
    /* если аккаунт существует, т.е. rows > 0 */
            // Загружаем, выводим диалоги и т.п.
            
        
    }
        else
        {
            
    /* если аккаунт не существует, т.е. rows == 0 */
        
    }

    P.S. хороший урок от DeimoS.
    P.S. Если бы вы ответил на:
    Цитата Сообщение от VVWVV Посмотреть сообщение
    3.1. Как вы получаете значение pInfo[playerid][pPassword].
    было бы все быстрее и проще.
    Последний раз редактировалось VVWVV; 18.03.2016 в 01:55.

 

 

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

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

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

Ваши права

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