Имя: Пароль:
1C
1С v8
Шифрование данных сертификатом с дальнейшей отправкой
,
0 ZhigaCzar
 
07.09.20
17:14
Доброго времени суток.
Такая ситуация: Получаем с сервера данные (в виде строки), которые необходимо подписать сертификатом и отправить обратно уже подписанное сообщение при этом еще преобразовав в base64.
После шифрования я записываю все это дело в файлик, и доставая от туда ДвоичныеДанные перевожу их в base64. Но переводится только 1/23 часть всего того, что надо.
Если смотреть через отладчик, что он там получил, то и видим, что получено то вроде все 5974 байта, а отображено только 256.
Я вот не пойму, почему он не переводит все данные, а только 256 байт.
Подскажите пожалуйста.
Не думаю, что это сыграет роль, но версии:
Конфиг: "Управление торговлей" (10.2.2.5)
Платформа: 1С:Предприятие 8.3 (8.3.12.1685)
Конфиг допиливается руками.
1 polosov
 
07.09.20
17:32
Показывай код.
2 lodger
 
07.09.20
17:41
в этой версии платформы запись в файл миновать нельзя?
3 ZhigaCzar
 
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 байт.
4 ZhigaCzar
 
08.09.20
08:49
https://ibb.co/n30prrq
Вот скрин, как выглядят ДвоичныеДанные.
Хотя на самом деле, если это дело запихнуть в буфер, то там все 5974 байта.
https://ibb.co/6FQwd6y

Вот по этому мне не понятно, почему он переводит в base64 далеко не всю информацию.
5 ZhigaCzar
 
08.09.20
08:51
Была идея, из буфера все перенести побайтово в строку, попутно переводя в шестнадцатиричную систему, а затем уже перевести в base64 средствами 1с, но при переводе в 64-ричную систему, он на входе требует двоичные данные.
6 Admin_Net_1C
 
08.09.20
09:25
(3) что за функция Base64 ? Вроде в платформенные только Base64Строка и Base64Значение.
7 PloAl
 
08.09.20
09:43
(4) У вас буфер равен 5974 им нельзя измерять.
Скопируйте весь текст двоичных данных в текстовый редактор.
Размер ДД в байтах будет длинна скопированного текста деленная на три.
8 ZhigaCzar
 
08.09.20
09:47
(6) Пардон, я просто эту строку было добавил только ради того, чтобы описать проблему, на самом деле делал через base64Строка();
9 ZhigaCzar
 
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=="
Два знака равно, насколько я понимаю, означают, что количество байт не равно какому то значению, мол оно не полное. Верно?!
10 PloAl
 
08.09.20
10:17
Три точки в конце обычно означают что не все данные показаны.
Попробуйте сохранить двоичные данные в файл или в методе подписать получить результат подписи в файл.
11 ZhigaCzar
 
08.09.20
10:23
(10) В том и соль, что если файл сохраняешь при подписи, то он включает в себя все 5974 байта. Однако, когда считываешь этот файл через "Новый ДвоичныеДанные(Файл)", то он берет не все. В этом вся проблема и заключается.
12 lodger
 
08.09.20
10:31
(11) просто странная постановка вопроса сбивает с толку.
из опыта в эти ДД мегабайты влазят без труда, а у тебя с байтами какая-то нестыковка.
13 lodger
 
08.09.20
10:32
может ты рядом проблему поищешь, а не в этой строке? или пересмотришь методику расчёта размера ДД?
14 ZhigaCzar
 
08.09.20
10:33
Как еще один пример:
        Данные = МенеджерКриптографии.Подписать(ПутьК_dataFile, Сертификат);
    ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "base64Binary");
    ДвоичныеДанные = ФабрикаXDTO.Создать(ТипДвоичныеДанные, Данные);
    ЛексическоеЗначение = ДвоичныеДанные.ЛексическоеЗначение;

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

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