При коммерческой разработке тиражных решений и заказных доработок на платформе 1С:Предприятие 8.3 в виде расширений конфигурации (файлов .cfe) разработчик сталкивается с задачей защиты своей интеллектуальной собственности. Защита может преследовать две ключевые цели: предотвращение несанкционированного изучения и копирования исходного кода (алгоритмов), а также ограничение нелицензионного запуска расширения на сторонних информационных базах. Разберем детально все доступные на сегодняшний день методы защиты расширений, их плюсы, минусы и практическую реализацию.
Рассмотрим стандартные механизмы защиты, предоставляемые конфигуратором платформы 1С:
Текст - Установить пароль шифрует текст модуля, однако реализация данного алгоритма в платформе известна, и в сети существует множество общедоступных скриптов, позволяющих снять или обойти пароль за несколько секунд.Следовательно, стандартные средства конфигуратора защищают только от случайного просмотра пользователем, но совершенно не защищают от подготовленного специалиста.
Разберем метод обфускации (запутывания) кода. Это преобразование исходного текста или байт-кода программы в вид, сохраняющий полную функциональность при выполнении платформой, но крайне сложный для анализа человеком и декомпиляторами.
При обфускации выполняются следующие операции:
_0x1A2B или случайные комбинации похожих букв).Выбрать/Если, что делает трассировку логики невозможной.Посмотрим на пример того, как преобразуется исходный алгоритм в расширении. Исходный понятный код:
&НаСервере
Функция РассчитатьСкидкуКлиента(Клиент, СуммаДокумента) Экспорт
Если СуммаДокумента > 100000 Тогда
Возврат 0.15;
ИначеЕсли СуммаДокумента > 50000 Тогда
Возврат 0.10;
КонецЕсли;
Возврат 0.05;
КонецФункции
После глубокой обфускации код превращается в сложную для восприятия конструкцию:
&НаСервере
Функция _0x00A(_0x00B, _0x00C) Экспорт
Перем _0x00D, _0x00E;
_0x00D = 0;
Пока Истина Цикл
Если _0x00D = 0 Тогда
_0x00E = ?(_0x00C > 100000, 0.15, ?(_0x00C > 50000, 0.10, 0.05));
_0x00D = 1;
ИначеЕсли _0x00D = 1 Тогда
Возврат _0x00E;
КонецЕсли;
КонецЦикла;
КонецФункции
В сочетании с удалением исходного текста при поставке обфускация делает попытку взлома и доработки такого расширения экономически нецелесообразной.
Проанализируем технологию создания внешних компонент по технологии Native API на языках C++, Rust или Go. Этот подход обеспечивает максимальную стойкость к анализу алгоритмов, так как код компилируется в машинные инструкции целевого процессора.
Частая ошибка начинающих разработчиков — попытка полностью перенести объекты и формы 1С во внешнюю динамическую библиотеку (.dll под Windows или .so под Linux). Делать этого не требуется. Правильная архитектура взаимодействия строится следующим образом:
Посмотрим на пример вызова внешней компоненты из модуля расширения:
&НаСервере
Функция ВыполнитьЗакрытыйРасчет(ВходныеДанныеСтруктура)
УстановитьВнешнююКомпоненту("ОбщийМакет.ЗащищенноеЯдроРасчета");
ПодключитьВнешнююКомпоненту("ОбщийМакет.ЗащищенноеЯдроРасчета", "ЗащитаРасширения", ТипВнешнейКомпоненты.Native);
Компонента = Новый ("AddIn.ЗащитаРасширения.CoreCalc");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ВходныеДанныеСтруктура);
СтрокаДанных = ЗаписьJSON.Закрыть();
СтрокаРезультата = Компонента.ExecuteCalculations(СтрокаДанных);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаРезультата);
Результат = ПрочитатьJSON(ЧтениеJSON);
Возврат Результат;
КонецФункции
Преимущества: машинный код практически невозможно декомпилировать до исходного состояния, в библиотеку легко встроить аппаратную привязку к серийным номерам материнской платы, процессора и сетевой карты.
Ограничения: требуется собирать отдельные бинарные файлы под разные платформы (Windows x86, Windows x64, Linux x64), а также учитывать ограничения при работе в веб-клиенте.
Если задача заключается в том, чтобы расширение работало только у клиента, оплатившего лицензию, применяются следующие схемы:
Константы.ИНН или данных справочника Организации расширение прекращает работу.Наиболее надежным современным способом защиты ноу-хау является архитектурный вынос бизнес-логики в облачный веб-сервис:
Пример обращения к защищенному бэкенду из модуля расширения:
&НаСервере
Функция ОтправитьЗапросНаЗащищенныйСервер(ДанныеДляОбработки, ТокенКлиента)
HTTPСоединение = Новый HTTPСоединение("api.myservice.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ТокенКлиента);
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/process", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеДляОбработки, КодировкаТекста.UTF8);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Иначе
ВызватьИсключение "Ошибка проверки лицензии или выполнения расчета: " + HTTPОтвет.КодСостояния;
КонецЕсли;
КонецФункции
Начиная с версии платформы 8.3.15, реализован механизм подписи расширений усиленной квалифицированной электронной подписью (ЭЦП). Подпись не скрывает программный код, но гарантирует целостность: при любой попытке модификации, снятия пароля или изменения текстов модулей расширение признается недействительным, и платформа блокирует его запуск до подтверждения администратором.
Разберем ограничения при разработке расширений для облачных сервисов (в частности, 1С:Предприятие через Интернет / 1С:Фреш):
Техническая защита всегда должна подкрепляться правовой основой:
Для надежной защиты тиражного расширения конфигурации оптимально комбинировать несколько подходов: