Как организовать лицензионную защиту расширения 1С для работы без постоянного интернета?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка тиражных расширений для платформы 1С:Предприятие неизбежно сталкивается с вопросом защиты авторских прав и контроля лицензионного использования. Основная сложность заключается в том, что код расширений относительно легко декомпилируется, а многие клиенты работают в закрытых контурах без стабильного доступа к интернету. Разберем комплексный подход к созданию системы защиты, которая обеспечит безопасность вашего интеллектуального труда и при этом будет удобна для конечного пользователя.

Архитектура системы лицензирования: комбинированный метод

Для создания надежной защиты мы не можем полагаться на один единственный механизм. Проанализируем наиболее эффективную стратегию, которая сочетает в себе онлайн-активацию и автономную работу. Суть метода заключается в том, что расширение обращается к вашему серверу (например, арендованному VPS) только один раз при первом запуске или с определенной периодичностью (раз в месяц или квартал).

Рассмотрим, как это работает по шагам:

  1. При первом запуске расширение запрашивает у пользователя пин-код.
  2. Программа собирает уникальный идентификатор оборудования (Fingerprint) сервера клиента.
  3. Данные отправляются на ваш HTTP-сервис.
  4. Сервер проверяет наличие лицензии и возвращает зашифрованный ключ активации, привязанный к конкретному «железу».
  5. Ключ сохраняется в базе клиента, и расширение переходит в полнофункциональный режим.

Использование Native API и внешних компонент

Одним из самых слабых мест в защите 1С является открытость исходного кода. Даже при использовании встроенных средств скрытия модулей, опытный специалист может получить доступ к алгоритмам. Выясним, как технология Native API помогает решить эту проблему. Вместо написания всей логики на языке 1С, мы можем вынести критически важные функции (например, сложные расчеты, алгоритмы формирования цен или специфические государственные проверки) во внешнюю компоненту, написанную на C++, Rust или Go.

Разберем преимущества такого подхода:

Привязка к оборудованию (Fingerprinting)

Чтобы клиент не мог просто скопировать информационную базу на другой сервер и продолжить работу, нам необходимо реализовать привязку к аппаратной части. Проанализируем ситуацию: какие данные лучше всего использовать для формирования уникального ID? Программисты часто используют серийный номер материнской платы, UUID процессора или идентификатор системного раздела диска.

В среде Windows это реализуется через WMI. Посмотрим на пример концептуальной схемы получения данных:


// Пример логики получения ID (псевдокод)
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
СлужбаWMI = Локатор.ConnectServer(".");
Объекты = СлужбаWMI.ExecQuery("SELECT SerialNumber FROM Win32_BaseBoard");
Для Каждого Объект Из Объекты Цикл
    СерийныйНомер = Объект.SerialNumber;
КонецЦикла;

Важно помнить, что в облачных средах и виртуальных машинах эти данные могут меняться или быть недоступны, поэтому систему привязки следует делать гибкой, учитывающей несколько параметров одновременно.

Асимметричное шифрование (RSA)

Для защиты самого файла лицензии, который хранится у клиента, мы рекомендуем использовать асимметричное шифрование. Это исключает возможность подделки лицензии, даже если пользователь найдет место её хранения. Разберем алгоритм работы:

Вы генерируете пару ключей: приватный (хранится только у вас) и публичный (вшивается в код расширения). Когда сервер активации выдает лицензию, он подписывает данные (ID оборудования, срок действия, набор функций) вашим приватным ключом. Расширение с помощью публичного ключа проверяет подпись. Если хотя бы один байт в файле лицензии будет изменен (например, дата окончания), проверка подписи провалится.

Где хранить данные лицензии в 1С?

Когда интернет отсутствует, расширение должно где-то брать информацию о том, что оно активировано. Проанализируем наиболее защищенные места в структуре 1С:

  1. Безопасное хранилище данных: Это специальный объект платформы БезопасноеХранилищеДанных. Данные в нем шифруются на уровне платформы и привязываются к конкретной базе. Доступ к ним извне (через консоли запросов или прямой доступ к СУБД) крайне затруднен.
  2. Макеты в виде двоичных данных: Можно хранить зашифрованный ключ в макете самого расширения, однако это менее надежно, так как макет можно заменить при наличии определенных навыков.
  3. Параметры сеанса или константы: Самый простой, но и самый уязвимый способ. Подходит только в сочетании с сильным шифрованием содержимого.

Посмотрим, как программно работать с безопасным хранилищем для записи токена:


// Запись ключа в безопасное хранилище
ЗначениеДляХранения = "Ваш_Зашифрованный_Токен_Активации";
БезопасноеХранилищеДанных.Записать("Лицензия_МоеРасширение", ЗначениеДляХранения);

// Чтение ключа
КлючЛицензии = БезопасноеХранилищеДанных.Прочитать("Лицензия_МоеРасширение");

Защита от перевода системного времени

Частая уловка пользователей для обхода временных лицензий — перевод системного времени назад. Чтобы предотвратить это, выясним причину блокировки в таких случаях. Мы можем использовать метод «Счетчика тиков» или фиксацию последнего времени запуска. При каждом запуске системы расширение должно сравнивать текущее время с временем последнего успешного запуска, сохраненным в скрытом месте. Если текущее время меньше сохраненного — значит, имела место манипуляция со временем, и работу следует заблокировать.

Обфускация кода

Даже если вы вынесли часть логики в компоненту, основной код 1С все равно нуждается в защите. Простая «Нетленка» или встроенное скрытие модулей — это лишь первый рубеж. Рассмотрим более глубокую обфускацию:

Цель обфускации — сделать стоимость взлома (затраты времени программиста на реверс-инжиниринг) выше, чем стоимость покупки легальной лицензии.

Защита от отключения расширения

Важно помнить, что в 1С пользователь с правами администратора может просто зайти в список расширений и снять галочку «Активно» или включить «Безопасный режим», который блокирует работу внешних компонент. Разберем способы противодействия:

  1. Контрольные точки: Внедряйте проверку лицензии в критические события системы, например, в обработчик ПриУстановкеПараметровСеанса или в модули часто используемых документов.
  2. Взаимный контроль: Если ваше решение состоит из нескольких расширений, каждое из них должно проверять наличие и активность «соседа».
  3. Интеграция в основную конфигурацию: Если клиент позволяет вносить небольшие правки в основную конфигурацию, можно добавить одну строку кода в глобальный модуль, которая будет проверять наличие вашего расширения и блокировать вход в систему при его отсутствии.

Подводя итог, создание надежной защиты — это всегда баланс между безопасностью и удобством. Использование Native API для логики, RSA для подписи лицензий и Безопасного хранилища для оффлайн-работы обеспечит высокий уровень защиты вашего продукта в экосистеме 1С.

← На главную