Пример шифрования данных.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

68 Comments

  1. coder1cv8

    Ей также можно дешифровать строки после моего обфускатора, только т-с-с-с! )

    Reply
  2. vde69

    давно хотел поиграться на эту тему, а тут повод 🙂

    конечно все простенько

    кстати можно нельзя шифровать несколькими ключами?

    Reply
  3. coder1cv8

    (2) Что значит несколькими? Типа массива из нескольких строк?… Нет, насколько я знаю…

    Reply
  4. vde69

    (3) нет я имею в виду шифрование с резервным ключем, тоесть есть 2 ключа (разных), мы шифруем и расшифровать можно любым из этих двух.

    например шифрование дисков так сделано, в случае утраты ключа можно расшифроврать ключем администратора

    Reply
  5. vde69

    кстати EncryptedData — не штатная библиотека, (укажи в загаловке ссылку на скачивание) хотя и халявная

    Reply
  6. coder1cv8

    (4) Вот насчет этого не в курсе… Вот описание Crypto API в msdn: http://msdn.microsoft.com/en-us/library/aa380254(VS.85).aspx там есть ответ, я в англицком не силен, к сожалению! (

    Reply
  7. vde69

    (6) похоже, что можно… хотя надо будет попробовать, может вечером поиграюсь

    Тут можно прикольную систему сделать…

    Reply
  8. MRAK

    При нажатии «дешифровать» выдает «Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса»

    Reply
  9. MRAK

    а, ясно… качать надоть…

    Reply
  10. coder1cv8

    (5) Вроде же входит в состав Windows?…

    ЗЫ: У кого нету можно скачать тут: http://www.microsoft.com/downloads/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&DisplayLang=en

    Reply
  11. coder1cv8

    Для тех у кого по каким-то причинам (ха-ха) не получается скачать с сайта microsoft, добавил dll-ку в шапку.

    Reply
  12. MRAK

    Теперь:

    {Форма.Форма(29)}: Ошибка при вызове метода контекста (SetSecret): Произошла исключительная ситуация: Параметр задан неверно.

    Пытаюсь расшифровать код «Обфускация кода 1С»)))

    Reply
  13. coder1cv8

    (12) Дык, задавай ключ верно, что ж ты хочешь! )

    Reply
  14. Noy

    Учитывая (10) думаю что обработку надо переименовать — «штатно» уже не катит…

    Reply
  15. coder1cv8

    (14) А кто бы подсказал в каких виндах этой длл-ки нету?… ) Похоже от ХР и выше?…

    Reply
  16. Noy

    (15) у меня на ноуте ХР СП3 — длл-ки нет…

    Reply
  17. coder1cv8

    (16) Хм, странно… У меня XP Prof SP2 dll-ка есть.

    Ладно, в любом случае, шапку переименовал и сюда библиотеку положил )

    Reply
  18. luns

    coder1cv8 красвчик!!! Всегда плюсую авансом…

    Reply
  19. Душелов

    Вот из-за таких, как он decode для 1С-ки не нужна будет 🙂

    Reply
  20. coder1cv8

    Добавил генерацию ключа 🙂

    Reply
  21. Abadonna

    (0) Я тут от не фиг делать написал внешнее приложение для шифрования. На разработку, по моим понятиям, как-то не тянет, если хочешь — кину тебе на мыло, прицепишь еще файлик 😉

    (тоже с генерацией ключа — GUID)

    Reply
  22. coder1cv8

    (21) Давай, кидай. Отчего же не прицепить? )

    Reply
  23. coder1cv8

    +(22) coder1cv8 собака yandex.ru

    Reply
  24. vde69

    ну собствено как я и говорил, ты меня сподвиг на подвиг 🙂 сделал идентификацию изменения критических полей элементов базы по хешу http://infostart.ru/projects/2964/

    Reply
  25. German

    а зная закодированный фрагмент и результат можно вычислить ключ?

    Reply
  26. coder1cv8

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

    ЗЫ: Вот здесь http://www.inattack.ru/article/472.html можно почитать про Crypto API на русском.

    Reply
  27. vde69

    (25) если это MD5 то практически нет (а там пожно юзать MD5), есть статьи по этому, в отдельных случаях подломать можно, но это исключение.

    ХЕШ MD5 ломают по таблицам извесных хешей, кстати виндовые пароли именно на хешах MD5 базируються

    Reply
  28. ded00786

    А как насчет графического шифрования?

    Это так, информация к размышлению 😉

    Reply
  29. coder1cv8

    Добавил утилитку написанную Abadonna. Плюсики ему можно поставить здесь же в комментах 🙂

    Reply
  30. ded00786

    (29,21) жирный плюс

    Reply
  31. logarifm

    + Пригодится

    Reply
  32. vladnet

    У меня вот такая ошибка: {Форма.Форма(30)}: Ошибка при вызове метода контекста (Decrypt): Произошла исключительная ситуация: Встречено неверное значение тега ASN1.

    Библиотеку выкачал, хотя она и была и зарегил.

    Reply
  33. Abadonna

    (32) Ха! У меня как раз такое на 7-ке вчера было, когда восстанавливал зашифрованные пароли пользователей из базы по учету всякой хрени 😉

    После шифрования заменил символы перевода строки на ‡ перед запистью в справочник (dbf), а при считывании — опять меняю ‡ на РазделительСтрок. Так взлетело

    Reply
  34. vladnet

    (33) В исходном тексте не встречается переводов строк (

    Да ошибка вылетает как в обработке 1с, так и в твоем Encipher

    Кстати а можно ли с помощью этой библиотеки шифровать 2 ключами:

    один для шифрования, другой для расшифрования?

    Reply
  35. coder1cv8

    Действительно, получается что-то с зашифрованными данными не так…

    Reply
  36. coder1cv8

    (34) А перешифрование исходного текста не помогает?…

    Reply
  37. Abadonna

    (34) Ты Encipher запусти, набери, например, слово «молоко» и зашифруй.

    Сколько строчек внизу будет? ДВЕ! Думаешь я сам их там так разбил? Ни фига, там образовался при шифровании символ перевода строки

    Reply
  38. Abadonna

    +(37) А вот при записи уже в базу (в дбф уж — точно) — происходит корявая запись в поле

    Reply
  39. coder1cv8

    (37) По моим наблюдениям перевод строки в шифрованном тексте сделан исключительно для удобства. В частности, в моем «Обфускаторе» я совсем убираю переводы строк из шифрованного текста, на расшифровку это никоим образом не влияет!

    Reply
  40. Abadonna

    (39) Ну попробуй ради интереса записать в dbf строку «мама»+РазделительСтрок+»папа» и погляди, что запишется

    Reply
  41. vladnet

    (34) Перешифрование не помогает, пробовал разные алгоритмы

    (38) Так я ведь в ДБФ не пишу, пробовал убрать переводы не помогает (

    Reply
  42. Abadonna

    (41) Ну не знаю.. Именно так я вчера победил её

    Reply
  43. vladnet

    (40) пока совсем не понял при чем тут ДБФ?

    Все происходит внутри одной обработки. Понимаю что там может быть разные переводы.

    Reply
  44. coder1cv8

    (41) Можно пример текста и ключ?…

    Reply
  45. vladnet

    (44)

    молоко

    237541f0ca3e432ba2dbac92485d1207

    Reply
  46. coder1cv8

    ДБФ тут ни причем! Это Абадонна о своем, о наболевшем наверно ))

    Reply
  47. Abadonna

    (46) О каком наболевшем? У меня все базы на скуле, но не делать же на нем и вшивенькую базу по учету компов-паролей-логинов…

    Reply
  48. coder1cv8

    (45) У меня проблема не воспроизводится.

    (47) Та я шучу! )

    Reply
  49. vladnet

    У меня почему то всегда эта ошибка вылезает, даже если ключом неправильным расшифровывать. Может и прав Абадонна, проблема в переводах строки, то что 1с автоматом заменяет переводы строк на свои, хотя вроде бы не должен. Сейчас проверю.

    Reply
  50. coder1cv8

    Интересный глюк…

    Reply
  51. vladnet

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

    Reply
  52. coder1cv8

    (51) Ну ёлки!!! )))

    Reply
  53. Abadonna

    (51) опанах! 😉

    Reply
  54. vladnet

    (52) (53) Ну я бы так сделал, чтобы тестировать было удобнее (

    Reply
  55. Abadonna

    (54) И нашелся бы человек, который понял все правильно, и начал вставлять в верхнее окошко, и недоумевал бы почему оно не пашет :)))

    Reply
  56. vladnet

    (55) По любому )

    А все таки не смотрели как можно шифровать 1 ключом, а расшифровывать другим. Один ключ публичный для расшифровки, другой для шифрования.

    Reply
  57. coder1cv8

    (56) Crypto API это позволяет, а объект CAPICOM, в свою очередь поддерживает практически все возможности Crypto API. Как это реализовать на практике, я лично, не задумывался… Я здесь давал уже ссылку, по-моему, на описание Crypto API на русском, почитай…

    ЗЫ: Это называется асимметричный алгоритм )

    Reply
  58. vladnet

    Читаю, пока не разобрался (

    Reply
  59. BOZKURT

    (0) Прикольно.

    Reply
  60. BOZKURT

    по поводу ошибки http://infostart.ru/profile/657/

    я с третьей попытки допер.. 🙂

    Reply
  61. coder1cv8

    (60) А я то думал это очевидно! 🙂

    Reply
  62. mov68

    Вопрос к спецам: есть ли шэш функции и как к ним обратиться, или плиз ссылку толковую на функции DDL.

    Reply
  63. xvas

    очень полезная инфа

    Reply
  64. ms200999

    (63)Согласен.

    Сохранил в закладки.

    Reply
  65. fr.myha
    Reply
  66. akifjevda

    Ребята, подскажите такую штуку. Шифрую строку по AES-128 (по факту — XML документ) с помощью capicom.dll и получаю зашифрованную строку. Как я понял она сразу обработана через base64. Проблема в том, что не могу расшифровать в php через mcrypt (алгоритм MCRYPT_RIJNDAEL_128). Даже если просто зашифровать mcrypt эту же строку, то зашифрованный вариант получается совсем другой чем в 1С или в Encipher.exe и примерно 2 раза короче. Где могут быть грабли?

    PS Немного разобрался в вопросе. CAPICOM заворачивает свой ответ в структуру ASN.1 для передачи бинарных данных и передает в структуре и алгоритм шифрования и длину ключа и сам зашифрованный поток и похоже вектор инициализации. Но все равно не могу расшифровать стандартными средствами php эти данные, уже все варианты перепробовал.

    Может кто-нибудь подсказать как указать capicom что надо шифровать в режиме ECB (чтобы не использовать вектор инициализации при расшифровке) и выдавать наружу только зашифрованный кусок, а не структуру???

    Reply
  67. teorver

    (1) Один умник до меня сделал обфускацию общего модуля… теперь сижу и парюсь, не могу обратно все вернуть, а очень надо, ибо нужны изменения в этом модуле. Ума не приложу как де-обфускацию сделать 🙁

    Reply
  68. timothy_

    С текстом понятно, а как с числами дело обстоит?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *