<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Скопировал код из статьи в обработку. Ввожу ключ — 123, текст — sss, функцию — sha-1 и получаю hmac — da2a7fa2ac3e18892b6d0d24221285fa1030b03d. Разве он не должен быть, как на скриншоте 83е…?
Ввожу ключ — 123456, тест — Вышел зайчик погулять, функцию — sha-1 и получаю:
{ВнешняяОбработка.HMAC.МодульОбъекта(74)}: Ошибка при вызове метода контекста (Создать)
636363636363636363636363636363636363636363636363636363636363 63636363641244b44843543b2043743043944743843a2043f43e43b44343 b44f44244c’ не соответствует простому типу: {http://www.w3.org/2001/XMLSchema }hexBinary
ДвоичныеДанные = ФабрикаXDTO.Создать(ТипhexBinary,nString);
по причине:
Несоответствие типов XDTO
по причине:
Ошибка проверки данных XDTO:
Значение: ‘24026036363636363636363636363636363636363636363636363636363
(1)
нет, потому что ключ нужно передавать в шестнадцатеричном виде.
(1)
Добавил поддержку кирилицы
(1)
в файле обработки есть пример
на 8.2 работать не будет, там нет ХешированиеДанных.
(4) к сожелению, да. Если хеширование sha1, тогда посмотритеhttp://infostart.ru/public/99739/ готовое решение.
пробовал реализовать sha256 на приведенном примере. Но хеш получается другой. Нежели генерировать его в online конвертерах. В коде какая-то ошибка ?
(6) Какой текст и ключ? У меня все работает как часы
Функция HMAC(Знач K, Знач text, Знач Hash)
А если ключ «K» это строка,а не число. Как его зашифровать в этот параметр?
(8) Вводите строку, все должно работать (:
Владимир, подскажите, пожалуйста, если мне нужно хеширование SHA-384, то получится ли использовать вместо функции SHA1(Знач nString, Hash) из Вашего алгоритма функцию из этого примера?https://1c-programmer-blog.ru/programmirovanie/md5-v-1s.html
Например, ту, что использует библиотеку CAPICOM. Ведь хеширования SHA-384 у 1С нет в платформе, верно?
(10) Да, все будет работать.
И да, хеширования SHA-384 в 1С нет (:
Помогите пожалуйста.
АПИСекрет = «cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk»;
Сигнатура = «8692c7a03a684765ac5fe04f04dd72c8POSThttps://localhost/api/getopenorders11223311FxOYiYfpMxmANj4kGJzg==»
хмак = HMAC(АПИСекрет, Сигнатура, «SHA256»);
На выходе 224c54567d42c5c3537bc305329694347fba095592094d6e88a2f342e788 ec1e
PHP:
$hmacsignature = base64_encode( hash_hmac(«sha256», $signature, base64_decode( $API_SECRET ), true ) );
На выходе: v+YF+qxhVqB95bjKZB7bN7ywpTgoPUleObTmXNoEE2E=
Расскажите что не так?
(12) Судя по всему в коде php у вас не просто получается hmac, а еще использует кодирование информации в 64-разрядный код. В публикации функция просто получает HMAC. Попробуйте получить по этим данным HMAC в онлайн генераторе и 1С. Результат будет одинаковый.
тоже интересно, можно ли как-то доработать обработку чтобы получить HMAC в Base 64
(14) Конечно можно. Посмотрите на сайтеhttps://infostart.ru/public/all/?st=t&public-filter%5Bsearch%5D=base64 , или поищите в интернете. Скорее всего Вашу проблему уже кто-то решал.
(13) Все равно не то что-то. Секрет передать в каком виде надо?
АПИСекрет = «cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk»;
Потому что даже убрав base64_encode из ПХП получая по
$hmacsignature = hash_hmac(«sha256», $signature, base64_decode( $API_SECRET ), true ) ;
Ответы разные.
Остается только в обработке Первое: base64_decode( $API_SECRET ) и Второе: hash_hmac(«sha256»,$signature, Результат_Первого), В_Двоичных)
Но даже получив ответ от ПХП не двоичные данные, а в шестнадцатеричной кодировке = Разные.
hash_hmac(«»sha256″», $signature, $API_SECRET, false )
Даже так разное
(16) Сложно сказать основываясь на вашем коде, что именно происходит. Предлагаю вам воспользоватся онлайн генераторомhttps://www.freeformatter.com/hmac-generator.html . Введите туда
;
АПИСекрет = «cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk»;
Сигнатура = «8692c7a03a684765ac5fe04f04dd72c8POSThttps://localhost/api/getopenorders11223311FxOYiYfpMxmANj4kGJzg==»
и результат у вас получится аналогичный с результатом в 1С,
Повторюсь ищите причину в php, судя по всему там не просто хеширование в hmac
Владимир, спасибо за процедуру. Она некорректно работала с кодировкой UTF8, я бы предложил сделать так (8.3):
Показать
Для проверки удобно использоватьhttps://www.freeformatter.com/hmac-generator.html
Доброго дня! Подскажите ,выложенный в публикации код такой же как и в обработке?
потому что воспользовавшись, кодом из публикации и попытавшись сравнить результат с онлайн генератором предложенным автором, ни разу не получил сходство ни по одному из алгоритмов шифрования. прикрепил файл
(20) День добрый! Код абсолютно идентичный. Проверил, у меня все работает на вашем примере. Посмотрите на описание передаваемых параметров и их формат, Вы точно правильно передаете их? Хочу обратить Ваше внимание на параметр K — ключ, он передается в шестнадцатеричном виде.
(21),
Т.е. в моем примере на скрине у меня ключ имеет строковое значение «key» я его должен перевести в hex и только после этого запускать функцию hmac?
(22) Именно так
(23) Подскажите, пожалуйста, как именно это сделать (привести строку к hex виду)?
(24)
А вот мой вариант. Строго в соответствии с алгоритмом из Вики (единственное отличие — предварительно от ключа рассчитывается MD5, это требуется в конкретно моей реализации, можно убрать)
Показать
Здравствуйте.
Я не понял, SHA-256 работает в 8.3 без использования внешних компонент?
Нужно в мобильное приложение вставить шифрование SHA-256?
Есть примеры кода?
(27)
Здравствуйте!
Есть, есть и даже поддерживает мобильное приложение
Функция — HMAC есть давней в публикацииhttps://infostart.ru/public/458286/
(25)Спасибо. Помогло.
Спасибо!
(26) спасибо за вариант, но к нему есть дополнение для случаев, когда длина ключа >64 байт:
через MD5 у меня не совпадает hmac 🙁
Вызываю вашу функцию,
В итоге различный хэш, если сгенерировать через сайтhmac hash .
Мой результат: ba60785f34fa7342118a36399be364c3
На сайте: c8c639dc293e0b25459e36e073d33430
Или ваша функция только для sha1 предназначена?
(35) Прочитайте (25) там ответ на ваш вопрос