При разработке собственных уникальных конфигураций на платформе 1С («нетленок») разработчики часто сталкиваются с угрозой кражи интеллектуальной собственности. В файловом варианте работы базы данных 1С скопировать папку с файлом .1CD на флешку и унести её на другой компьютер не составляет никакого труда. Если злоумышленнику или недобросовестному клиенту не нужны сами учетные данные, а требуется только готовая рабочая база с настроенными справочниками, документами и отчетами, он может просто очистить базу от документов и начать работать «с нуля».
В этой статье мы подробно рассмотрим, как защитить конфигурацию 1С от копирования и несанкционированного запуска на сторонних компьютерах. Мы разберем как простые программные методы, которые можно реализовать собственными силами, так и профессиональные инструменты защиты.
Прежде чем приступать к технической реализации защиты, важно четко разграничить два понятия:
В рассматриваемом случае основная цель — не дать запустить конфигурацию на чужом компьютере, даже если папка с базой была полностью скопирована. Для этого нам необходимо создать программный механизм лицензирования, который будет проверять параметры текущего компьютера и блокировать работу программы при их несовпадении.
Этот способ основан на получении уникальных идентификаторов комплектующих компьютера (материнской платы, процессора или жесткого диска) через встроенный инструментарий Windows Management Instrumentation (WMI) и сравнении их с заранее сгенерированным ключом активации.
Рассмотрим по шагам, как реализовать этот алгоритм в коде 1С.
Шаг 1. Получение аппаратного идентификатора компьютера
Для этого мы воспользуемся COM-объектом WbemScripting.SWbemLocator. Напишем функцию, которая собирает серийный номер материнской платы и уникальный идентификатор процессора:
Функция ПолучитьИдентификаторКомпьютера() Экспорт
Идентификатор = "";
Попытка
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
СлужбаWMI = Локатор.ConnectServer(".");
// Получаем уникальный ID процессора
Процессоры = СлужбаWMI.InstancesOf("Win32_Processor");
Для Каждого Процессор Из Процессоры Цикл
Идентификатор = Идентификатор + СокрЛП(Процессор.ProcessorId);
Прервать; // Достаточно получить данные первого процессора
КонецЦикла;
// Получаем серийный номер материнской платы
Платы = СлужбаWMI.InstancesOf("Win32_BaseBoard");
Для Каждого Плата Из Платы Цикл
Идентификатор = Идентификатор + СокрЛП(Плата.SerialNumber);
Прервать;
КонецЦикла;
Исключение
// На случай ограничения прав пользователя или сбоя WMI возвращаем резервный маркер
Идентификатор = "DEFAULT_HARDWARE_KEY_12345";
КонецПопытки;
Возврат СокрЛП(Идентификатор);
КонецФункции
Шаг 2. Хеширование данных для генерации лицензионного ключа
Передавать и хранить аппаратный код в открытом виде небезопасно. Нам необходимо преобразовать полученную строку в уникальный хэш-код с помощью встроенного объекта 1С ХешированиеДанных. Также добавим секретное слово («соль»), чтобы злоумышленник не смог восстановить алгоритм генерации ключа.
Функция СгенерироватьКлючЛицензии(АппаратныйКод) Экспорт
Хеширование = Новый ХешированиеДанных(АлгоритмХеширования.MD5);
// Добавляем к аппаратному коду секретную "соль" разработчика
Хеширование.Добавить(АппаратныйКод + "MySecretSalt_9921!");
ХешСумма = Хеширование.ХешСумма;
// Получаем строковое представление хеша (убираем пробелы)
СтрокаКлюча = СтрЗаменить(Строка(ХешСумма), " ", "");
Возврат СтрокаКлюча;
КонецФункции
Шаг 3. Проверка лицензии при старте системы
При установке базы данных у клиента программист запускает специальную обработку, которая считывает аппаратный код компьютера клиента, генерирует ключ и записывает его в скрытую константу или защищенный регистр сведений базы.
При каждом запуске системы в глобальном модуле обычного приложения (в процедуре ПриНачалеРаботыСистемы) выполняется следующая проверка:
Процедура ПроверитьЛицензированиеПриЗапуске() Экспорт
ИДКомпьютера = ПолучитьИдентификаторКомпьютера();
ОжидаемыйКлюч = СгенерироватьКлючЛицензии(ИДКомпьютера);
// Получаем эталонный ключ, сохраненный при активации программы
СохраненныйКлюч = Константы.ЛицензионныйКлюч.Получить();
Если СохраненныйКлюч <> ОжидаемыйКлюч Тогда
Предупреждение("Критическая ошибка лицензирования!
|База данных скопирована или запущен на неавторизованном оборудовании.
|Работа программы будет завершена.", 10, "Внимание");
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Просто написать код проверки привязки к оборудованию недостаточно. Если злоумышленник откроет конфигуратор, он сможет легко найти процедуру проверки и удалить строчки кода, блокирующие запуск. Поэтому критически важные модули необходимо защитить от анализа и редактирования.
Проанализируем основные способы защиты кода модулей:
.cf) в настройках поставки для необходимых общих модулей снимается флаг "Исходный текст". В результате код будет работать, но в конфигураторе вместо текста модуля будет отображаться надпись: *Исходный текст отсутствует*.о101оо(), lI1llI()), удаляют комментарии и форматирование, заменяют строковые константы на зашифрованные массивы байт. Программа продолжает функционировать, но восстановить логику запутанного кода становится экономически нецелесообразно.Самый надежный способ программной защиты для настольных конфигураций — это вынесение части критического функционала (например, алгоритмов расчета цен, скидок, себестоимости или процедур проверки лицензии) во внешние динамические библиотеки (DLL), скомпилированные на языках C++, Delphi или C#.
Разберем, как выглядит схема взаимодействия 1С с такой компонентой:
Попытка
ПодключитьВнешнююКомпоненту("ПутьККомпоненте\SecurityBlock.dll", "SecLib", ТипВнешнейКомпоненты.Native);
ЗащищенныйОбъект = Новый("AddIn.SecLib.SecurityExtension");
Исключение
Предупреждение("Не удалось загрузить библиотеку защиты системы!");
ЗавершитьРаботуСистемы(Ложь);
КонецПопытки;
// Вызываем защищенную процедуру проверки ключа из DLL
Если НЕ ЗащищенныйОбъект.ПроверитьЛицензию() Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
Если библиотека отсутствует или проверка внутри нее завершилась ошибкой — конфигурация просто не запустится либо ключевые документы перестанут проводиться, так как формулы расчета будут недоступны.
Если вы разрабатываете тиражное решение и не хотите «изобретать велосипед», лучшим выбором станет интеграция с официальной **Системой лицензирования и защиты конфигураций (1С:СЛК)** от фирмы «1С».
Преимущества интеграции с 1С:СЛК:
Выясним главную уязвимость файловых баз: клиент имеет физический доступ к файлу базы данных .1CD. До тех пор, пока база лежит на компьютере клиента, риск копирования остается высоким.
Если бизнес-модель позволяет, переведите клиентов на работу в облаке (SaaS):
Защита конфигураций 1С — это комплексный процесс. Выбор метода зависит от ценности вашего программного продукта и потенциальной квалификации злоумышленников: