За последние 24 часа нас посетили 73348 программистов и 1652 робота. Сейчас ищут 1060 программистов ...

Авторизация зашифрованным MD5

Тема в разделе "PHP для новичков", создана пользователем Sasha55555, 26 июл 2018.

  1. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    Как можно войти в аккаунт, если регистрируюсь такой функцией
    Код (Text):
    1. private function encryptPassword($password, $md5 = true) {
    2.         if($md5 !== false) {
    3.             $password = md5($password);
    4.         }
    5.    
    6.         $hash = substr($password, 16, 16) . substr($password, 0, 16);
    7.         return $hash;
    8.     }
    9.     private function getLoginHash($password, $staticKey, $username) {    
    10.         $hash = $this->encryptPassword($password, false);
    11.         $hash .= $staticKey;
    12.         $hash .= "a1ebe00441f5aecb185d0ec178ca2305Y(02.>'H}t\":E1_root";
    13.         $hash = $this->encryptPassword($hash);
    14.         $hash = password_hash($hash, PASSWORD_DEFAULT, [ 'cost' => 12 ]);
    15.    
    16.         return $hash;
    17.     }
    18.         $hashedPassword = strtoupper(md5($password));
    19.         $staticKey = 'e4a2dbcca10a7246817a83cd';
    20.  
    21.         $fancyPassword = $this->getLoginHash($hashedPassword, $staticKey, $username);
    Вот страница входа:
    Код (Text):
    1. <?php
    2. class login {
    3.     public $username;
    4.     public $password;
    5.     public function __construct($u, $p) {
    6.         $this->username = $u;
    7.         $this->password = $p;
    8.     }
    9.     //Information: 2 means error. true means logging in...
    10.     function isUserValid()
    11.     {
    12.         $con = mysqli_connect('localhost', 'root', '', 'test');
    13.         $username = mysqli_real_escape_string($con, $this->username);
    14.         $password = mysqli_real_escape_string($con, $this->password);
    15.  
    16.         $query = mysqli_query($con, "SELECT * FROM `penguins` WHERE `username` = '".$username."' AND `password` = '".md5($password)."'");
    17.         if($query)
    18.         {
    19.             while($row = mysqli_fetch_assoc($query)) {
    20.                 return true;
    21.                 die();
    22.             }
    23.         }
    24.         else {
    25.             return 2;
    26.             die();
    27.         }
    28.     }
    29. }
    30. ?>
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Это какой то ужас. Бедные пингвины.
    --- Добавлено ---
    Ну если ты это ложишь в бд то с этим и сверяй а не с md5($password)
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Sasha55555 во первых md5 устарел, умные люди используют давно уже password_hash
    --- Добавлено ---
    Во вторых - так проверять пароль какое - то прямо удаление зуба через задницу.
    В третьих. Это конечно классно что ты сделал экранирование данных. Но обычно это делают уже с тем значением которую ты не посредственно вставляешь в строку запроса, а у тебя тут тоже как то через опу сначала экранирование и после этого md5 сверху и потом уже в запрос...
    Рекомендации:
    перейти на функцию pasword_hash, далее при сверки пароля сначала выбрать по username строку в таблице, получить от туда данные о password для данного user и после уже в php сравнить поступающий пароль с текущим значением пароля в таблице функцией password verify .
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    md5 устарело, вместо неё желательно использовать password_hash
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    А первый кусок кода я даже комментировать и разбирать не хочу.... Хеш сделал в password_hash, а пароль запихал в md5... Перепиши сеё безобразие на password_hash
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Сделай копию сохрани на компе через полгода загляни посмотри... И наименование wtf поставь
    --- Добавлено ---
    А сейчас сотри всё что написал и сделай подобную (пример ниже) функцию
    PHP:
    1. static public function addUser($email, $password, $name, $phone = '')
    2.     {
    3.         if (empty($email) or empty($password) or empty($name)) {
    4.             return false;
    5.         }
    6.         $password = password_hash($password, PASSWORD_DEFAULT);
    7.         $sql = 'INSERT INTO users (name, email, phone, password)' .
    8.             ' VALUES (:name, :email, :phone, :password)';
    9.         $sth = DB::connect()->prepare($sql); // Этой моё подключение к бд. Тебе необходимо поставить своё.
    10.         $arrayParam = [
    11.             ':name' => $name,
    12.             ':phone' => $phone,
    13.             ':email' => $email,
    14.             ':password' => $password
    15.         ];
    16.         $sth->execute($arrayParam);
    17.         return DB::connect()->lastInsertId();
    18.     }
    P.S Параметры столбцов и передаваемых аргументов подкорректируй под свою таблицу.
     
  7. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    Это регистрация, а авторизация?
    Код (Text):
    1. if($penguin->database->usernameExists($username) === false) {
    2.             password_verify('KitsuneTimingAttack', '$2y$12$5hf7vOtBjsNJf6oZSsnyXOlcLTRblTwSg550SR0ohxVUkItmXhMM6'); //Mitigate timing attacks
    3.             $penguin->send("%xt%e%-1%101%");
    4.             return $this->removePenguin($penguin);
    5.         }
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
     
  9. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    У меня зарегистрировано уже 100 человек, как можно перейти на password_hash? И сейчас каким образом хешируется пароль?
    $2y$12$.3TjTwffHoY76X/UCu358.WiHPqx1X7iwK0k3s7GKFgNXXB4WhUji
    Вот функция авторизации которая работает с этим паролем, как перенести ее ко мне?
    Код (Text):
    1. final class Login extends ClubPenguin {
    2.  
    3.     public function __construct() {  
    4.         parent::__construct();
    5.        
    6.         Logger::Fine("Login server is online");
    7.     }
    8.  
    9.     protected function handleLogin($socket) {
    10.         $penguin = $this->penguins[$socket];
    11.  
    12.         if($penguin->handshakeStep !== "randomKey") {
    13.             return $this->removePenguin($penguin);
    14.         }
    15.  
    16.         $this->databaseManager->add($penguin);
    17.  
    18.         $username = Packet::$Data['body']['login']['nick'];
    19.         $password = Packet::$Data['body']['login']['pword'];
    20.        
    21.         if($penguin->database->usernameExists($username) === false) {
    22.             password_verify('KitsuneTimingAttack', '$2y$12$5hf7vOtBjsNJf6oZSsnyXOlcLTRblTwSg550SR0ohxVUkItmXhMM6'); //Mitigate timing attacks
    23.             $penguin->send("%xt%e%-1%101%");
    24.             return $this->removePenguin($penguin);
    25.         }
    26.        
    27.         $penguinData = $penguin->database->getColumnsByName($username, array("ID", "Username", "Password", "SWID", "Email", "Banned"));
    28.         $encryptedPassword = $penguinData["Password"];
    29.        
    30.         if(password_verify($password, $encryptedPassword) !== true) {
    31.             $penguin->send("%xt%e%-1%101%");
    32.             return $this->removePenguin($penguin);
    33.         } elseif($penguinData["Banned"] > strtotime("now") || $penguinData["Banned"] == "perm") {
    34.             if(is_numeric($penguinData["Banned"])) {
    35.                 $hours = round(($penguinData["Banned"] - strtotime("now")) / ( 60 * 60 ));
    36.                 $penguin->send("%xt%e%-1%601%$hours%");
    37.                 $this->removePenguin($penguin);
    38.             } else {
    39.                 $penguin->send("%xt%e%-1%603%");
    40.                 $this->removePenguin($penguin);
    41.             }
    42.         } else {          
    43.             $confirmationHash = md5($penguin->randomKey);
    44.             $friendsKey = md5($penguinData["ID"]); // May need to change this later!
    45.             $loginTime = time();
    46.            
    47.             $penguin->database->updateColumnById($penguinData["ID"], "ConfirmationHash", $confirmationHash);
    48.             $penguin->database->updateColumnById($penguinData["ID"], "LoginKey", $encryptedPassword);
    49.  
    50.             $penguin->handshakeStep = "login";
    51.            
    52.             $penguin->send("%xt%l%-1%{$penguinData["ID"]}|{$penguinData["SWID"]}|{$penguinData["Username"]}|$encryptedPassword|1|45|2|false|true|$loginTime%$confirmationHash%$friendsKey%101,1%{$penguinData["Email"]}%");
    53.         }
    54.     }
    55.  
    56.     protected function handleDisconnect($socket) {
    57.         $penguin = $this->penguins[$socket];
    58.         $this->removePenguin($penguin);
    59.     }
    60.  
    61.     public function removePenguin($penguin) {
    62.         $this->removeClient($penguin->socket);
    63.  
    64.         $this->databaseManager->remove($penguin);
    65.  
    66.         unset($this->penguins[$penguin->socket]);
    67.  
    68.         Logger::Notice("Player disconnected");
    69.     }
    70.    
    71. }
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Sasha55555 нанять программиста за деньги. Ибо сами вы учиться не хотите. Есть такой раздел тут фриланс - обратитесь туда. Не надо ставить опыты на живых людях наймите специалиста пусть сделает. Нельзя на продакшене разрабатывать такие вещи!
     
  11. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    А нормально можете ответить? Каким образом закодирован пароль выше?
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    Никак. Сотрите хешпароли в бд и предложите юзерам восстановить доступ к аккаунту
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @MouseZver не обязательно Можно сделать кастыль временный.
    Нормально я ответил выше. Вы не понимаете. Что я могу сделать? Поэтому и говорю наймите специалиста.
    Но можно попробовать включить свой мозг (если он есть). И догодаться переделать уже регистрацию на пассворд хеш. А авторизацию сделать пассворд хеш и если не подошло прогнать по мд5 и если так не подошло послать отрицательный овтет.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Варварство какое. Есть же нормальное решение.
     
    Sasha55555 нравится это.
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это, мне кажется не то. Он регал юзеров используя md5 в качестве хэша пароля. Тут однозначно. просто предложить пользователям зарегаться заново.

    Одно дело если бы он регал изначально используя password_hash а в последующем сменил просто алгоритм хэширования.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Зачем?
    Ставишь правило, что если пароль в md5, а это легко проверить по его длине и отсутствию того же знака доллара, то сверяешь его с тем, что в БД по md5, а потом прогоняешь через password_hash() и пишешь в БД новый слепок. Зачем просить кого-то перерегаться, если тебе нужен его ПАРОЛЬ, который он точно так же вводит и передает тебе в чистом виде?
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это костыль. Имхо, не стоит ложить костыль при старте проекта. Проще просто попросить пользователей зарегаться по новой. Из всего 15)
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Проще вообще ничего не хешировать, раз на то пошло. Первое и главное правило - клиента не должны касаться ТВОИ проблемы. Он не должен входить в ТВОЕ положение.

    Не вижу проблему в том, чтобы временно инклудить файлик, реализующий перехеширование пароля. То, что клиентов не много, не значит, что на них надо хер класть и перекладывать на них решение твоих косяков.

    Ему плевать на твою красоту кода, на твое чувство вины из-за технического долга. Он вообще не в курсе, как работает твой сайт. И если мне завтра какой-то сервис снихрена пришлет мессагу, мол, срочно зарегайся заново, потому что мы подумали подумали, да и дропнули твой аккаунт, потому что нам влом решать задачу рехеширования, сервис будет послан в дальнее пешее.
     
    askanim нравится это.