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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *