Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Шифрование данных сертификатом с дальнейшей отправкой

Шифрование данных сертификатом с дальнейшей отправкой
Я
   ZhigaCzar
 
07.09.20 - 17:14
Доброго времени суток.
Такая ситуация: Получаем с сервера данные (в виде строки), которые необходимо подписать сертификатом и отправить обратно уже подписанное сообщение при этом еще преобразовав в base64.
После шифрования я записываю все это дело в файлик, и доставая от туда ДвоичныеДанные перевожу их в base64. Но переводится только 1/23 часть всего того, что надо.
Если смотреть через отладчик, что он там получил, то и видим, что получено то вроде все 5974 байта, а отображено только 256.
Я вот не пойму, почему он не переводит все данные, а только 256 байт.
Подскажите пожалуйста.
Не думаю, что это сыграет роль, но версии:
Конфиг: "Управление торговлей" (10.2.2.5)
Платформа: 1С:Предприятие 8.3 (8.3.12.1685)
Конфиг допиливается руками.
   polosov
 
1 - 07.09.20 - 17:32
Показывай код.
   lodger
 
2 - 07.09.20 - 17:41
в этой версии платформы запись в файл миновать нельзя?
   ZhigaCzar
 
3 - 08.09.20 - 08:10
(1)
        ТекДата = ТекущаяДата();
    МенеджерКриптографии = Новый МенеджерКриптографии("", "", 80);
    
    ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
    Сертификаты = ХранилищеСертификатов.ПолучитьВсе();
    Для Каждого СертификатХранилища Из Сертификаты Цикл
        Если СертификатХранилища.Субъект.OID1_2_643_3_131_1_1 = Справочники.Организации.НайтиПоКоду("93   ").ИНН И
            СертификатХранилища.ДатаОкончания > ТекДата Тогда
            Сертификат = СертификатХранилища;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    ПутьК_dataFile = ДанныеАвторизации.Получить("data");
    МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "";
    ПутьШифрованный_dataFile = ПутьК_dataFile + "_crypt";
    МенеджерКриптографии.Подписать(ПутьК_dataFile, ПутьШифрованный_dataFile, Сертификат);
    Данные = МенеджерКриптографии.Подписать(ПутьК_dataFile, Сертификат);
        //Строчка ниже по идее должна все преобразовать в  base64, но нет. Преобразовывает только "видимую" часть в 256 байт, а не все 5974 байта.

        НовыеДанные = Base64(Данные);

Вот зашифровал я их, а что делать с ними дальше, я хз. 

(2) Как можешь видеть в примере — можно, но смысла от этого не особо то и много, все равно таким образом только 256 байт.
   ZhigaCzar
 
4 - 08.09.20 - 08:49
https://ibb.co/n30prrq
Вот скрин, как выглядят ДвоичныеДанные.
Хотя на самом деле, если это дело запихнуть в буфер, то там все 5974 байта.
https://ibb.co/6FQwd6y

Вот по этому мне не понятно, почему он переводит в base64 далеко не всю информацию.
   ZhigaCzar
 
5 - 08.09.20 - 08:51
Была идея, из буфера все перенести побайтово в строку, попутно переводя в шестнадцатиричную систему, а затем уже перевести в base64 средствами 1с, но при переводе в 64-ричную систему, он на входе требует двоичные данные.
   Admin_Net_1C
 
6 - 08.09.20 - 09:25
(3) что за функция Base64 ? Вроде в платформенные только Base64Строка и Base64Значение.
   PloAl
 
7 - 08.09.20 - 09:43
(4) У вас буфер равен 5974 им нельзя измерять.
Скопируйте весь текст двоичных данных в текстовый редактор.
Размер ДД в байтах будет длинна скопированного текста деленная на три.
   ZhigaCzar
 
8 - 08.09.20 - 09:47
(6) Пардон, я просто эту строку было добавил только ради того, чтобы описать проблему, на самом деле делал через base64Строка();
   ZhigaCzar
 
9 - 08.09.20 - 09:50
(7)
Вот таким макаром выглядит скопированные ДД в текстовый редактор
30 82 17 52 06 09 2A 86 48 86 F7 0D 01 07 02 A0 82 17 43 30 82 17 3F 02 01 01 31 0E 30 0C 06 08 2A 85 03 07 01 01 02 02 05 00 30 0B 06 09 2A 86 48 86 F7 0D 01 07 01 A0 82 12 7A 30 82 07 FD 30 82 07 AA A0 03 02 01 02 02 0B 00 8B D5 98 DA 00 00 00 00 03 23 30 0A 06 08 2A 85 03 07 01 01 03 02 30 82 01 24 31 1E 30 1C 06 09 2A 86 48 86 F7 0D 01 09 01 16 0F 64 69 74 40 6D 69 6E 73 76 79 61 7A 2E 72 75 31 0B 30 09 06 03 55 04 06 13 02 52 55 31 18 30 16 06 03 55 04 08 0C 0F 37 37 20 D0 9C D0 BE D1 81 D0 BA D0 B2 D0 B0 31 19 30 17 06 03 55 04 07 0C 10 D0 B3 2E 20 D0 9C D0 BE D1 81 D0 BA D0 B2 D0 B0 31 2E 30 2C 06 03 55 04 09 0C 25 D1 83 D0 BB D0 B8 D1 86 D0 B0 20 D0 A2 D0 B2 D0 B5 D1 80 D1 81 D0 BA D0 B0 D1 8F 2C 20 D0 B4 D0 BE D0 BC 20 37 31 2C 30 2A 06 03 55 04 0A...

После перевода в base64 в конце стоит "UDIA=="
Два знака равно, насколько я понимаю, означают, что количество байт не равно какому то значению, мол оно не полное. Верно?!
   PloAl
 
10 - 08.09.20 - 10:17
Три точки в конце обычно означают что не все данные показаны.
Попробуйте сохранить двоичные данные в файл или в методе подписать получить результат подписи в файл.
   ZhigaCzar
 
11 - 08.09.20 - 10:23
(10) В том и соль, что если файл сохраняешь при подписи, то он включает в себя все 5974 байта. Однако, когда считываешь этот файл через "Новый ДвоичныеДанные(Файл)", то он берет не все. В этом вся проблема и заключается.
   lodger
 
12 - 08.09.20 - 10:31
(11) просто странная постановка вопроса сбивает с толку.
из опыта в эти ДД мегабайты влазят без труда, а у тебя с байтами какая-то нестыковка.
   lodger
 
13 - 08.09.20 - 10:32
может ты рядом проблему поищешь, а не в этой строке? или пересмотришь методику расчёта размера ДД?
   ZhigaCzar
 
14 - 08.09.20 - 10:33
Как еще один пример:
        Данные = МенеджерКриптографии.Подписать(ПутьК_dataFile, Сертификат);

    ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "base64Binary");
    ДвоичныеДанные = ФабрикаXDTO.Создать(ТипДвоичныеДанные, Данные);
    ЛексическоеЗначение = ДвоичныеДанные.ЛексическоеЗначение;

И результат не радует окончанием на "IPxg==".
   ZhigaCzar
 
15 - 08.09.20 - 10:34
(13) "пересмотришь методику расчёта размера ДД" с этого момента поподробнее можно? )
   IVT_2009
 
16 - 08.09.20 - 10:35
это вам не поможет с ИТС:

&НаСервере
Функция ЗашифроватьНаСервере(АдресДанных, ДанныеСертификатов)
    // Создадим сертификаты на основании двоичных данных сертификатов с клиента 

    Сертификаты = Новый Массив();
    Для Каждого ДанныеСертификата Из ДанныеСертификатов Цикл
        Сертификаты.Добавить(Новый СертификатКриптографии(ДанныеСертификата));
    КонецЦикла;
    МенеджерКриптографии = Новый МенеджерКриптографии("", "", 75);
    // Получим файл для шифрования из временного хранилища

    Данные = ПолучитьИзВременногоХранилища(АдресДанных);
    Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
        Возврат Ложь;
    КонецЕсли;
    // Шифруем двоичные данные

    ЗашифрованныеДвоичныеДанные = МенеджерКриптографии.Зашифровать(Данные, Сертификаты);
    // Сохраняем во временное хранилище

    АдресДанных = ПоместитьВоВременноеХранилище(ЗашифрованныеДвоичныеДанные);
    Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ШифрованиеФайла()
    Адрес = "";
    Результат = ПоместитьФайл(Адрес, , , Истина);
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    ТипыСертификатов = Новый Массив;
    ТипыСертификатов.Добавить(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    Список = ПолучитьСписокСертификатов(75, ТипыСертификатов, Истина);
    // В примере всегда шифруем с помощью первого по порядку сертификата

    Сертификаты = Новый Массив;
    Сертификаты.Добавить(Список[0].Выгрузить());
    // Шифруем файл

    Результат = ЗашифроватьНаСервере(Адрес, Сертификаты);
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    // Интерактивно сохраняем зашифрованный файл на диск

    ПолучитьФайл(Адрес, , Истина);
КонецПроцедуры
   lodger
 
17 - 08.09.20 - 10:38
(14) "==" в конце подписанных данных это вроде нормально?
   acht
 
18 - 08.09.20 - 10:43
(9) Знаками "=" строка base64 дополняется до кратности длины 4. Это описано в куче документаций, но никто не хочет даже искать ее, предпочитая строить персональные теории заговора.
   PloAl
 
19 - 08.09.20 - 10:53
(11) Какой размер у не подписанного файла?
Как выглядят байты 254 - 258 в подписанном и не подписанном файле?
   acht
 
20 - 08.09.20 - 10:59
Есть устойчивое впечатление, что весь шум из за того, что при формировании представления двоичных данных к строке, платформа весьма благоразумно отображает шестнадцатиричным кодом только первые 256 байт, добавляя к ним три точки. ТС же этого не понимает и требует отображения всего-всего-всего.
   lodger
 
21 - 08.09.20 - 11:07
(15) например Определение размера двоичных данных в байтах
квоБайт = дд.Размер();
   ZhigaCzar
 
22 - 08.09.20 - 11:12
(19) Размер не подписанного файла равен 73 байта
(20) Ну смотри. Действительно, когда данные в файле, они полные. Читаю файл как двоичные данные и тут уже есть деление. Отображение действительно сосет и не показывает все что надо, но в этом проблемы нет, т.к. данные там все еще полные. А вот при кодировании в base64 этих данных, часть куда-то теряется. в ЭТОМ проблема.
(21) Не, ну это просто возврат количества байт. Он мне возвращает 5974.
   acht
 
23 - 08.09.20 - 11:20
(22) А. Есть еще одно устойчивое мнение, что ты не понимаешь сути данных, которые возвращает МенеджерКриптографии.Подписать. И даже не подозреваешь о существовании синтаксис-помошника.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.