Электронные ключи SenseLock являются наилучшим средством для защиты программ, написанных на легко декомпилируемых скриптовых языках, к которым можно отнести скрипты 1С, .NET, PHP и другие.
Задача надежной защиты скриптов для 1С нетривиальна, но легко решается используя возможности электронных ключей SenseLock. Они позволяют разработчику вынести часть алгоритма защищаемой программы в ключ и тем самым не только защитить её от несанкционированного копирования, но и предотвратить изучение внутренних алгоритмов работы для возможного дальнейшего использования третьими лицами, например для создания программных аналогов.
Использование внешних компонент из продуктов компании 1С
Для работы с внешним ActiveX компонентом 1С, прежде всего необходимо зарегистрировать его в системе стандартной утилитой MS Windows - RegSvr32.exe.
RegSvr32.exe SenselockKey.dll
После этого внешний компонент становится доступным для работы из среды 1С и появляется возможность использовать его методы и свойства.
Ниже приведен пример подключения внешнего компонента защиты SenselockKey в коде глобального модуля конфигурации 1С.
перем senselock Экспорт; Процедура ПриНачалеРаботыСистемы() Ок = ПодключитьВнешнююКомпоненту("AddIn.SenselockKey"); Если Ок = 0 Тогда Предупреждение("Не удалось загрузить компонент AddIn.SenselockKey"); ЗавершитьРаботуСистемы(0); Возврат; КонецЕсли; senselock = СоздатьОбъект("AddIn.SenselockKey"); ret = senselock.sense_enum(); КонецПроцедуры
Алгоритм использования электронного ключа SenseLock EL
Основным методом организации защиты на основе электронных ключей SenseLock является вынесение части алгоритмов из конфигурации 1С в ключ. Более подробно с технологией защиты с использованием электронных ключей SenseLock EL можно ознакомиться в "Руководстве разработчика".
Для того, чтобы организовать обмен данных с ключом из внутреннего языка 1С, прежде всего необходимо определить, как будет осуществляться поиск ключей. Для этого с помощью функции sense_setmode() следует установить метод поиска. Затем следует определить общее количество подключенных ключей с помощью функции sense_enum(). После того, как было получено их количество, необходимо инициализировать дальнейшую работу с ключом функцией sense_open(). Теперь можно выполнять различные функции, такие как sense_led(), sense_getinfo().
Для того, чтобы начать работать с прошивкой ключа, необходимо выбрать рабочий каталог внутри ключа функцией sense_changedir() и произвести проверку PIN-кода функцией sense_verifypin().
После этого, чтобы передать данные в электронный ключ, следует заполнить буфер обмена с помощью функций sense_setbyte(), sense_setshort(), sense_setlong(), sense_setfloat(), sense_setdouble() или sense_setstring(), указывая при этом смещение относительно начал буфера. Следует помнить, что максимальная длина буфера 250 байт. Перед вызовом функции sense_execute() необходимо установить количество байт в буфере обмена, которые будут посылаться в ключ. Для этого надо установить значение свойства BufferLen.
Функция sense_execute () вызывает исполняемый модуль внутри ключа, передавая ему данные из буфера обмена. После выполнения, буфер обмена содержит данные, полученные из ключа, а свойство BufferLen содержит размер полученных данных. Доступ к данным осуществляется функциями sense_getbyte(), sense_getshort(), sense_getlong(), sense_getfloat(), sense_getdouble() или sense_getstring().
Список свойств и методов внешнего компонента SenselockKey.dll
Свойства:
- BuffLen [read/write]
Размер буфера обмена до и после вызова sense_execute(). - Error [read]
Код ошибки, возникший при работе с электронным ключом SenseLock.
Методы:
- sense_setmode()
Настройки параметров для работы с электронным ключом SenseLock. - sense_enum()
Получение количества найденных электронных ключей SenseLock согласно установленным настройкам. - sense_open()
Открытие электронного ключа SenseLock. - sense_close()
Закрытие электронного ключа SenseLock и сброс параметров его работы. - sense_getinfo()
Получение информации о найденном электронном ключе SenseLock. - sense_led()
Управление светодиодным индикатором электронного ключа SenseLock. - sense_time()
Получение времени из электронного ключа SenseLock (при использовании моделей, оснащённых часами реального времени). - sense_changedir()
Переход в указанный каталог файловой системы электронного ключа SenseLock. - sense_verifypin()
Авотризация PIN-кода доступа к каталогу файловой системы электронного ключа SenseLock. - sense_execute()
Запуск EXF модуля в электронном ключе SenseLock. - sense_setbyte()
Установка BYTE'а (1 байт) в буфере обмена. - sense_setshort()
Установка SHORT'а (2 байта) в буфере обмена. - sense_setlong()
Установка LONG'а (4 байта) в буфере обмена. - sense_setfloat()
Установка FLOAT'а (4 байта) в буфере обмена. - sense_setdouble()
Установка DOUBLE'а (8 байт) в буфере обмена. - sense_setstring()
Установка строки в буфере обмена. - sense_getbyte()
Получение BYTE'а (1 байт) из буфера обмена. - sense_getshort()
Получение SHORT'а (2 байта) из буфера обмена. - sense_getlong()
Получение LONG'а (4 байтf) из буфера обмена. - sense_getfloat()
Получение FLOAT'а (4 байтf) из буфера обмена. - sense_getdouble()
Получение DOUBLE'а (8 байт) из буфера обмена. - sense_getstring()
Получение строки из буфера обмена.
Пример использования:
// Заполняем буфер, передаваемый в ключ senselock.sense_setbyte(0, 1); // 1 байт senselock.sense_setbyte(1, 22); // 1 байт senselock.sense_setfloat(2, X); // 4 байта senselock.sense_setfloat(6, Y); // 4 байта senselock.sense_setfloat(10, Cell); // 4 байта senselock.sense_setfloat(14, X_Offset); // 4 байта senselock.sense_setfloat(18, Door_Width); // 4 байта senselock.sense_setfloat(22, NetLength); // 4 байта senselock.BufferLen = 26; // Длина передаваемого буфера // Запустить на выполнение EXF модуль 0x1000 в электронном ключе SenseLock res = senselock.sense_execute("1000", 0); Сообщить ("Execute : " + res); // Обработка полученных результатов вычисления Сообщить(senselock.sense_getbyte(0)); Сообщить(senselock.sense_getbyte(1)); Сообщить(senselock.sense_getfloat(2)); Сообщить(senselock.sense_getfloat(6)); Сообщить(senselock.sense_getlong(10)); Сообщить(senselock.sense_getlong(14));