Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Sargez  
#1 Оставлено : 12 декабря 2018 г. 13:59:13(UTC)
Sargez

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.11.2018(UTC)
Сообщений: 8

Здравствуйте.

Стоит задача: есть файл и отдельная подпись. Нужно проверить был ли данный файл подписан этой подписью.
в рук-ве разработчика нашел пример и перевел его на 1С, ниже код. В момент проверки "oSignedData.Verify(Message, Истина)" выдается сообщение: " (CAdESCOM.CadesSignedData.1): The hash value is not correct." Помогите, пожалуйста, понять в чем ошибка?

Процедура Проверить()

CAPICOM_VERIFY_SIGNATURE_ONLY = 0;

oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
//Загрузка подписанных данных для проверки.
Content = ЗагрузитьФайл(ПутьКФайлу);
Message = ЗагрузитьФайл(ПутьКПодписи);
oSignedData.Content = Content;
//Проверка отделенной подписи
Ответ = oSignedData.Verify(Message, Истина);

КонецПроцедуры

Функция ЗагрузитьФайл(FileName)

ForReading = 1;

fso = Новый COMОбъект("Scripting.FileSystemObject");
ts = fso.OpenTextFile(FileName, ForReading);
LoadFile = ts.ReadAll();

Возврат LoadFile;

КонецФункции

Спасибо большое за помощь!
Offline two_oceans  
#2 Оставлено : 12 декабря 2018 г. 17:40:09(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Если подпись не в формате Base64, то читать ее методом для текстового файла плохая идея. А уж сам файл наверняка бинарный. FSO.TextStream вместе с Visual Basic крайне вольно работает с текстами - может изменить кодировку считанного файла как посчитает нужным, выкинуть или вставить переводы строк и в результате на проверку уйдет совсем не то, что лежит в файлах на диске. Лучше вместо fso.OpenTextFile создать объект ADODB.Stream в режиме Binary и считать файлы им.

Отредактировано пользователем 12 декабря 2018 г. 17:43:13(UTC)  | Причина: Не указана

Offline Sargez  
#3 Оставлено : 12 декабря 2018 г. 17:46:32(UTC)
Sargez

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.11.2018(UTC)
Сообщений: 8

Автор: two_oceans Перейти к цитате
Если подпись не в формате Base64, то читать ее методом для текстового файла плохая идея. А уж сам файл наверняка бинарный. FSO.TextStream вместе с Visual Basic крайне вольно работает с текстами - может изменить кодировку считанного файла как посчитает нужным, выкинуть или вставить переводы строк и в результате на проверку уйдет совсем не то, что лежит в файлах на диске. Лучше вместо fso.OpenTextFile создать объект ADODB.Stream в режиме Binary и считать файлы им.


Спасибо Вам за отклик!
подскажите, а есть пример считывания файла, например, pdf или xml с помощью ADODB.Stream и получения его в формате txt?
Offline two_oceans  
#4 Оставлено : 12 декабря 2018 г. 18:41:13(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
txt? Наверно надо определиться все же какой режим считывания нужен двоичный или текстовый, на всякий случай оба примера. В случае текстового ADODB.Stream позволяет явно указать кодировку файла. В переменной FName имя файла откуда читать, в переменной S будет содержимое файла.
К слову, в сочетании с
Код:
ParFile.CopyTo Stream2 ' скопировать с текущей позиции до конца в другой ADODB.Stream
или
ParFile.SaveToFile FName2, 2 ' сохранить стрим в файл, 2 - перезаписывать
можно свободно менять кодировку файлов или сохранить скачанный файл.

Отредактировано пользователем 12 декабря 2018 г. 19:00:00(UTC)  | Причина: Не указана

Offline Sargez  
#5 Оставлено : 12 декабря 2018 г. 19:45:17(UTC)
Sargez

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.11.2018(UTC)
Сообщений: 8

Я переписал чтение файлов на "ADODB.Stream" спасибо Вам большое!
только у меня пока все равно не складывается пазл.
у меня есть файл "test.xml" и подпись подписавшая этот файл: "test.sig".
вот мой код:

ПодписьMessage = ЗагрузитьФайл(Подпись,Ложь, Истина);
ФайлContent = ЗагрузитьФайл(Файл,Ложь);

CADESCOM_BASE64_TO_BINARY = 1;
CADESCOM_CADES_BES = 1;

oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");

oSignedData.Content = ФайлContent;//dataToVerify;
oSignedData.VerifyCades(ПодписьMessage, CADESCOM_CADES_BES, true);

Функция ЗагрузитьФайл(FileName, ЧитатьФайлЧерезКом = Истина, ЭтоПодпись = Ложь)

Если ЧитатьФайлЧерезКом Тогда
ForReading = 1;

fso = Новый COMОбъект("Scripting.FileSystemObject");
ts = fso.OpenTextFile(FileName, ForReading);
LoadFile = ts.ReadAll();
Иначе

Если ЭтоПодпись Тогда

Stream = Новый COMОбъект("ADODB.Stream");
Stream.Mode = 3;//'3 -adModeReadWrite 'разрешение на чтение и запись
Stream.Type = 1; //'1 - adTypeBinary, 2 - adTypeText ' двоичный режим
Stream.Open();
Stream.loadFromFile(FileName);
Stream.Position=0;
LoadFile=Stream.Read(-1);
Stream.Close();
Stream = Неопределено;

Иначе

Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 2;
Stream.charset="utf-8";
Stream.Open();
Stream.loadFromFile(FileName);
LoadFile=Stream.readText();
Stream.Close();
Stream = Неопределено;
КонецЕсли;

КонецЕсли;

Возврат LoadFile;

КонецФункции


когда я считываю сам файл - вижу его как текст - вроде бы все ок. в момент когда читаю подпись, ее читаю уже как ДД на выходе получаю COMSafeArray и в этом массиве лежат двоичные данные.
попробовал в таком варианте все отдать в
oSignedData.VerifyCades(ПодписьMessage, CADESCOM_CADES_BES, true);

таже ошибка "(CAdESCOM.CadesSignedData.1): The hash value is not correct."

сижу пока копаю дальше...
Offline two_oceans  
#6 Оставлено : 13 декабря 2018 г. 12:51:44(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Тогда наверно надо начать с начала и подкинуть идей с чем еще поэкспериментировать. Насколько вижу из текстового считывания выкинуты строки "Stream.Mode = 3;" в начале и "Stream.Position=0;" перед .readText Имеет смысл поэкспериментировать с Position установив значение 0 или 3 перед чтением. Суть в том, что если стрим открывается для чтения-записи, то насколько помню после загрузки текущая позиция будет в конце стрима и ничего вообще не считается, поэтому приходится выровнять позицию на начало. Если test.xml сохранен в кодировке utf-8, то в начале может быть метка порядка байтов (признак utf-8 сохраненный блокнотом или другим текстовым редактором) и по идее метку не надо подписывать, а просто выкидывать. Установка значения Position в 3 как раз выкидывает метку.

Дальше, вот этот файл test.xml откуда получили? Если, например, скопировали со страницы сайта или из некого паспорта информационной системы в формате Word, то вполне возможно что при сохранении в отдельный файл сохранили в неверной кодировке. В стандартном блокноте при сохранении файла внизу есть переключатель кодировки.

Вообще если просмотреть содержимое (через FAR, например) в test.sig данные текстовые или двоичные? Ну, предполагаю что с ним все в порядке раз дело доходит до проверки хэша. Это если конечно описание ошибки верное и данный код не возвращается на любой сбой.
Offline Sargez  
#7 Оставлено : 13 декабря 2018 г. 13:42:13(UTC)
Sargez

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.11.2018(UTC)
Сообщений: 8

добрый день!

Спасибо. попробовал поиграться с "Stream.Position" и "Stream.Mode", но пока безуспешно. Причем, когда считываю файл "test.xml" (сохранен был уже в кодировке utf-8), то в отладке вижу, что метка кодировки считана и присутствует, те position=3 не выкидывает эту метку получается? приложил скриншот 2018-12-13_13-34-17.png (5kb) загружен 6 раз(а).

пробовал оба файла: сам файл и подпись считать в двоичном режиме, ошибка таже. Файл и подпись получили от коллег со стороны.
сам файл "test.xml" - текстовые данные, а файл "test.sig" при открытии отображается такое ощущение в кодировке base64

Offline two_oceans  
#8 Оставлено : 13 декабря 2018 г. 13:57:26(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Метка порядка байтов (Byte Order Mark, BOM) это непечатный символ Юникода он ничего общего не имеет со стандартом Xml (в описании допустимых символов xml этот символ исключен) и используется исключительно текстовыми редакторами, может отсутствовать даже если файл в кодировке utf-8, но тестовый редактор этого не пометил. Просмотрщик может не отображать этот непечатный символ или отображать квадратик или вопросик вместо него, так что тут 100% наличие не установить. заголовок
Код:
<?xml version="1.0" encoding="UTF-8"?>
идет непосредственно после метки порядка байтов, так что похоже метка все же есть и она отрезается, иначе бы вышло
Код:
ml version="1.0" encoding="UTF-8"?>
.

Отредактировано пользователем 13 декабря 2018 г. 13:58:26(UTC)  | Причина: Не указана

Offline Василий12  
#9 Оставлено : 9 сентября 2019 г. 18:20:04(UTC)
Василий12

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.09.2019(UTC)
Сообщений: 1
Российская Федерация

Добрый день.
при попытке проверить подпись возникает сообщение "Ошибка при вызове метода контекста (VerifyCades): Произошла исключительная ситуация (CAdESCOM.CadesSignedData.1): Cannot find object or property."
по какой причине это может происходить?

при попытке сформировать подпись с меткой времени сообщение "Группа или ресурс не находятся в нужном состоянии для выполнения требуемой операции.", сертификат без OСSP(добавил в свойствах), TSP также руками указал.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.