The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Обфускация структуры полей в базе данных
Хорошим примером защиты данных в разных базах является их шифрование. Для
хранения паролей используют лишь хеш. А хеш, как известно, необратим.
Нижепредложенный perl-скрипт хорош для огораживания структуры полей таблиц баз
данных под управлением MySQL 5.x.  Обфускация полей базы вкупе с шифрованием
данных может минимизировать потери в случае эксплуатации sql-injection
уязвимостей и утечки данных.
В качестве аргументов передаётся файл с SQL-дампом структуры БД и "соль" к
хэшу. На выходе формируется файл с полями, заменёнными на нечитаемые наборы
символов, что затрудняет определение суть хранимых в полях данных (если данные
в БД хранятся в зашифрованном виде).

Код ниже:

   use Digest::SHA qw(sha256_hex);
   print "-------------------------------------\n";
   print "db_obfuscator started\n";
   if (($#ARGV + 1)<2)
   {
        print "run $0 db_name.sql pass\n";
        print "-------------------------------------\n";
        die;
   }
   my $db_filename = $ARGV[0];
   my $db_filename_out =  $ARGV[0];
   $db_filename_out =~ /(\w+)\.(\w+)/;
   $db_filename_out = $1 . "_out." . $2;
   my $base_hash = sha256_hex($ARGV[1]);
   my $hash_str = $base_hash . "test_str";
   my $text;
   $q = sha256_hex($hash_str);
   #print "$hash_str = $q\n";

   $filesize  = -s $db_filename;
   open DB,"<", $db_filename or die "could not open $db_filename\n";
   my $filesize_test = read (DB, $text, $filesize);
   print "read $filesize_test bytes from $db_filename\n";
   close DB;
   my @matches  = ($text =~ /\`[a-z,_,0-9]+\`/g);
   #print "found @matches.lenght() \n";
   foreach $abc(@matches)
   {
        $q = sha256_hex($base_hash.$abc);
        $text =~s/$abc/\`$q\`/g;
   #       print "$abc = $q\n";
   }
   open (outfile, ">", $db_filename_out);
   printf outfile $text or die "could not write $db_filename_out\n";
   close(outfile);
   my $filesize_out = -s $db_filename_out;
   print "wrote $filesize_out bytes into $db_filename_out\n"
 
18.01.2016 , Автор: 赤熊
Ключи: database, field, obfuscator, hash, perl / Лицензия: CC-BY
Раздел:    Корень / Безопасность / Шифрование, PGP

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, cmp (ok), 08:23, 19/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Отличный пример говнокода, уважаемый, если уж постите что-то, то хоть хелпу вбейте в код, иначе проще самостоятельно написать.
     
     
  • 2.6, Аноним (-), 11:17, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Вы не поняли, это видимо юмор такой, типа "обфускация кода для обфускации". Старая школа, респект за ($#ARGV + 1)<2 и @matches  = ($text =~ /\'[a-z,_,0-9]+\'/g).


     
     
  • 3.11, Crazy Alex (ok), 04:43, 20/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    И что здесь неясного?
     

  • 1.2, Аноним (-), 09:12, 19/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    if (($#ARGV + 1)<2)

    гениально

     
     
  • 2.4, _KUL (ok), 10:21, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Да и say уже пора использовать, не зря же за разрабы беспокоятся, кол-во символах в популярных командах уменьшают :)
    perl -e "use v5.10; if (scalar @ARGV < 2) {say \"Is bad\";};"
     
     
  • 3.7, Andrey Mitrofanov (?), 11:42, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > кол-во символах в
    > уменьшают :)
    > perl -e "use v5.10; if (scalar @ARGV < 2) {say \"Is bad\";};"

    "...\"...\"..."  =>  '..."..."...'  //Что ты сделал в свои годы для ш-ш-перла?

     
     
  • 4.9, _KUL (ok), 15:41, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Вы уверены, что я не из самодельного интерпретатора передаю строку с коммандами, который не понимает обработку одинарных кавычек?
    В файле программы слешей не было бы.
     
  • 2.12, Crazy Alex (ok), 04:48, 20/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    (@ARGV < 2) было бы чуть короче, но по-моему не принципиально.
     
  • 2.17, hyphop (?), 22:13, 22/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Мне тоже понравилась эта строча ))) Так за то и любим перл - что можешь писать как захочется )))
     

  • 1.3, Approximator (?), 09:47, 19/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Коллеги, не пинайте студента. Сейчас руки отобьёте, озлобится и пойдёт семки грызть по подъездам с охотой крепкой.
    Человек решил для себя конкретную задачу. Молодец.

    Но автору: однако, комментировать код полезно не только лишь для тех, кто не смотрит в завтрашний день ...

    :-)

     
     
  • 2.5, _KUL (ok), 10:25, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Коллеги, не пинайте студента. Сейчас руки отобьёте, озлобится и пойдёт семки грызть
    > по подъездам с охотой крепкой.
    > Человек решил для себя конкретную задачу. Молодец.
    > Но автору: однако, комментировать код полезно не только лишь для тех, кто
    > не смотрит в завтрашний день ...
    > :-)

    Наоборот, пристыдят и он на зло всем хихикающим, пойдёт и плюсы по Страуструпу выучит!
    p.s. хорошая книжка http://www.ozon.ru/context/detail/id/25227935/ а потом вот эту интересно читать http://www.ozon.ru/context/detail/id/4289407/

     

  • 1.8, qqq (??), 13:30, 19/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Мало перереименовать поля в дампе БД, нужно ведь и клиентский код исправить, чтобы там использовались новые имена полей. Не будешь же везде писать
    $sql = "SELECT " . sha256_hex($base_hash."name") . ", " . sha256_hex($base_hash."bdate") . " FROM user";
    вместо
    $sql = "SELECT name,bdate FROM user";

     
     
  • 2.10, 3619629066 (?), 16:07, 19/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    В том то весь и замут. В клиенском коде пиши имена в кавычках
    char *sql_str= "select 'name' from 'users';";
    И парсер так-же всё обработает.
     
     
  • 3.14, Аноним (-), 21:04, 20/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > В том то весь и замут. В клиенском коде пиши имена в
    > кавычках
    > char *sql_str= "select 'name' from 'users';";
    > И парсер так-же всё обработает.

    Я одного не пойму. А что, просто взять Green SQL и адекватно его настроить - или просто проверять передаваемые в предикат поля на предмет наличия там UNION - это не комильфо? Обязательно надо вот так, автогеном, через ж.пу, без наркоза - и при этом надеяться, что  _вот это вот_ поможет?

     
  • 3.15, Аноним (-), 15:10, 21/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > В том то весь и замут. В клиенском коде пиши имена в
    > кавычках
    > char *sql_str= "select 'name' from 'users';";
    > И парсер так-же всё обработает.

    Тогда где здесь защита от sql-injections?

     
     
  • 4.16, 3619629066 (?), 17:38, 21/01/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >Тогда где здесь защита от sql-injections?

    Слонопок? Защита от защиты же.
    Базу тырят и вместо структуры видят антиструктуру. База коллапсирует, все коллапсируют.

     
     
  • 5.18, Аноним (-), 08:36, 05/02/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно, хакеры взломавшие сервер настолько глупые что совсем не поймут что это у них тут в базе. А зачем они вообще сервер ломали?
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру