1. PHP / Говнокод #15772

    +154

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    function unpackLoginAndPas($signed,$iv, $dateSend){
        global $crypt, $cryptLast,  $defaultDate, $ivsId, $mysqlBaseName, $mysqlBase;
        //получаем текущую дату. 
        if (isset($dateSend) )
          $date = $dateSend;
        else
          $date = $defaultDate;
    
          $query = "SELECT id FROM ivs WHERE val='$iv';" ;
        $query = $mysqlBase->query($query);// or die (compactResult('error','криворукий программист!'));
        //есть ли такой маркер безопасности?
        if ($query->num_rows)//раз есть, то надо послать за другим маркером. Такой уже не годиться. 
            die (compactResult('error','bad iv marker,pls generate new iv'));
        //запоминаем такой маркер безопасности, и больше под ним не пускаем.
        //получаем id автоинкремент
        $myBase = $mysqlBase->query("SHOW TABLE STATUS FROM $mysqlBaseName") or die (compactResult('error','SystemTable not get (')); ;
        $result = false;
        //поиск времени изменения БД.
        $dateSrv = (int)( $date->getTimestamp() / 1000 );
        while($row = $myBase->fetch_assoc()){
          if ($row['Name'] !== "ivs" )
    	continue;
          $ivsId = $row["Auto_increment"];
        }
    
        $userIP = getUserIpAddr();
        $mysqlBase->query("INSERT INTO ivs(val,IP) VALUES('$iv','$userIP')") or die(compactResult('error','криворукий программист!'));
    
        //составляем строку из даты, которая у нас будет ключем. 1 раз в 5 минут она становиться другой.
        $decodeKey = /*формирование строки от даты*/
        $dateLast = $date->add( DateInterval::createFromDateString(' 5 minuts ' ) );
        $decodeKeyLast = /*формирование строки от даты*/
        //var_dump($decodeKey);
        $decodeKey = md5($decodeKey);
        $decodeKeyLast = md5 ( $decodeKeyLast );
        
        mcrypt_generic_init ($crypt,$decodeKey,$iv);
        mcrypt_generic_init ($cryptLast,$decodeKeyLast,$iv);
        //декриптуем
        $encDataLoginAndPass = rtrim (mdecrypt_generic($crypt,$signed));
        $encDataLoginAndPassLast = rtrim (mdecrypt_generic($cryptLast,$signed));
        //если правильный был и ключ(время не истекло) и 
        //var_dump($encDataLoginAndPass);
        $encDataLoginAndPass = json_decode ($encDataLoginAndPass,true)  or ( ($decodeKey = $decodeKeyLast ) and json_decode ($encDataLoginAndPassLast,true) )or die(compactResult('error','Key time out.'));
        //в поле secdata в POST будет лежать массив, декодированный
        mcrypt_generic_init ($crypt,$decodeKey,$iv);
    
        $temp = array_keys($encDataLoginAndPass);
        $encData = array('login'=>$temp[0], 'password'=>end($encDataLoginAndPass));
        $encPost = mdecrypt_generic($crypt, base64_decode( $_POST['secdata'] ) );
        $encData['post'] = json_decode (rtrim($encPost)) or die(compactResult('error','post uncompressed!'));
        //деинит
        mcrypt_generic_deinit ($crypt);
        //раз все прошло успешо, возвращаем массив с логином и паролем, который проверяем дальше. Тут даже использование вместо пароля, его хеша не поможет от хака. будем надеятся на алгоритм шифровки. Хотя есть взять, и знать что тут будет одинаковая информация, то вычислить её по паре перехваченных обращений не составит труда. Надо бы переделать на хеш от логина с паролем. Хотя и это врядли поможет. Надо взять что-то изменяемое. От чего можно будет отталкиваться. Но это надо обдумывать.
        return $encData;
    };

    попытка шифрования в 1-м проекте.
    Человек первый раз писал на php. Оно и видно...

    Запостил: Dart_Sergius, 17 Апреля 2014

    Комментарии (30) RSS

    • > $decodeKey = /*формирование строки от даты*/
      Самое интересное место выкинул ;)

      Там хоть какой-то секретный кусок (API key?) используется, или тупо чистая дата?
      Ответить
      • чистейшая дата только не в обычном формате(типо год в конце а месяц в начале ). Я выкинул это потому что этот кусок ещё не переписан и используется.
        Ответить
        • Хотя чего стесняться - это код моего первого сайта ^_^
          Сам я с++-шник.
          Ответить
          • Задумался, как бы это произнести "с++-шник"
            Сиплюсплюсшник? Говно какое-то.
            Ответить
          • Пиши на Wt, чо.
            Ответить
            • > Пиши на Wt, чо.
              Недостаточная абстракция от веба...

              Надо на canvas & websocket замутить тонкого клиента, и забыть о html, js, css и прочей хуйне как о страшном сне :) Только кресты, только хардкор.
              Ответить
    • > die(compactResult('error','криворукий программист!'))
      Умри, криворукий программист!
      Ответить
      • > Человек первый раз писал на php.
        > Умри, криворукий программист!
        Походу этот раз для него оказался последним :(
        Ответить
      • > $query = $mysqlBase->query($query);// or die (compactResult('error','криворукий программист!'));
        Вот это адовее. Почему-то в этой квере решил убрать.
        Ответить
        • > Почему-то в этой квере решил убрать.
          Она часто падала.
          Ответить
    • >Человек первый раз писал на php.
      я чет не вижу особой разницы между кодом людей, которые годами на php кодят
      Ответить
      • Да тут проблемы не столько в коде, сколько с криптографией. Криптуха это такая область, с которой лишний раз связываться не хочется, разве что just for fun поиграться :) Придумывать свой протокол или алгоритм - гарантия фейла почти на 146%. Да и если реализовывать готовый и проверенный - даже опытные люди запросто фейлятся... openssl, apple, mysql... сотни их...
        Ответить
        • но он все-равно молодец, хотя бы постарался :)
          Ответить
          • Ну в начале даже есть защита от атаки повтором.
            Ответить
        • Так в опенссл ошибки не было ни одной. Криптографической.
          Ответить
          • Что значит "криптографической"? Неверная реализация криптографических примитив?
            Ответить
            • В данном контексте - все алгоритмы надёжны, реализованы нормально, ошибки исключительно вокруг них.
              Ответить
              • > реализованы нормально
                Сам проверял? :) Говорят, что в недрах OpenSSL творится такой пиздец, что не каждый решается его прочесть...

                Ну и доки к OpenSSL на офсайте/в манах просто ахуенны. Кто пытался заюзать openssl и читал их - меня поймет. Пример доки: https://www.openssl.org/docs/crypto/rsa.html
                Ответить
                • У меня квалификации недостаточно. Шанс всегда есть, конечно.
                  А так, когда-то использовал, проблемы были, но не настолько дикие.
                  Логика микрософтовских провайдеров меня вымораживала больше, я однажды убил два дня, чтобы только понять, как зашифровать-подписать и с какого у меня не работает.
                  Ответить
                  • помню, делали даже кросс-платформенную либу, для сертификатов x.509 и шифрования на оных
                    т.е. надо было реализовать одновременно на openssl и m$
                    оба пиздец, несомненно
                    Ответить
                  • > Логика микрософтовских провайдеров
                    Там хоть доки есть... А не тупой список функций. Но да, без бутылки обертки не въедешь :)

                    А вообще, если нужна только софтовая крипота: crypto++.
                    Ответить
                    • > crypto++
                      И botan.
                      Ответить
                    • Доки-доками, но в отладчике два дня и просидел. И примеров качал обилие. Прочем, всё равно не вспомню, в чём там был конкретно косяк. Или описание было недостаточно кошерным, или ещё чего, проще оказалось скачать примеров и посмотреть по готовым.
                      Ответить

    Добавить комментарий