Ж у р н а л   о   к о м п ь ю т е р н ы х   с е т я х   и   т е л е к о м м у н и к а ц и о н н ы х   т е х н о л о г и я х
СЕТИ И СИСТЕМЫ СВЯЗИ on-line
  ПОИСК: ПОДПИСКА НА НОВОСТИ: НОМЕР:
    ДОМОЙ • Архив: Новостей | Конференций | НомеровПодписка
 
   
 
   
    
РЕДАКЦИЯ
 
Все о журнале
Подписка
Как проехать
Где купить
Отдел рекламы
График выхода журнала
Адреса в Интернет

РУБРИКАТОР
   
• Инфраструктура
• Информационные
   системы

• Сети связи
• Защита данных
• Кабельные системы
• Бизнес
• Колонка редактора
• Электронная
   коммерция

• Только на сервере
• Системы
   учрежденческой
   связи

• Новые продукты


Rambler's Top100

  

Бесплатные советы по защите от пиратов

Мартин Хеллер

Как защитить свои программные компоненты от “взломщиков” и не создать при этом неудобств для пользователей?

Иногда в мою голову приходят довольно неплохие идеи. Например, как в тот раз, когда я впервые увидел полностраничный дисплей фирмы Radius и спросил, нельзя ли придумать какой-нибудь способ поворачивать его так, чтобы можно было менять “портретный” режим на “ландшафтный”. Или когда я предложил группе разработчиков Visual С++ из Microsoft использовать “мастеров” (wizards) для создания файла проекта на основе библиотеки классов MFC, поскольку выполнение этой операции вручную было слишком утомительным занятием для большинства программистов. За все мои идеи мне почти ничего не перепало, и я подозреваю, что новая идея, которой я загорелся теперь, опять не принесет мне ни цента. Однако перейдем к делу.

Компания Microsoft стремится к тому, чтобы управляющие элементы ActiveX были объектами, которые можно свободно загрузить из Internet. Но существует также множество разработчиков этих компонентов, которые не заинтересованы в бесконтрольном копировании своего кода: они хотят получать деньги за свою работу. Наиболее очевидное решение заключается в том, чтобы сама Microsoft платила разработчикам за управляющие элементы ActiveX. Во многих случаях так оно и происходит, но Microsoft не может платить каждому, кто решил заняться программированием компонентов. Некоторые управляющие элементы слишком специализированны или дорогостоящи для того, чтобы фирма Microsoft ими заинтересовалась, другие конкурируют с продуктами, созданными или спонсированными самой Microsoft, а иные совсем никуда не годятся — их просто никто не купит.

Другое очевидное решение — встроить защиту в сами компоненты. Но тогда возникает вопрос: как остановить пиратов, не причиняя неудобств законным пользователям? На конференции профессиональных разработчиков для Internet, прошедшей в марте текущего года, представитель Microsoft дипломатично обошел этот вопрос. А после апрельской выставки Tech Ed, где я беседовал с поставщиками, мне стало ясно, что пока никто из них просто не знает, как это сделать. Во время разговора в конференц-зале за чашкой кофе с Дейвом Метвином из журнала Windows Magazine я поделился с ним своими догадками. Он-то и натолкнул меня на идею решения этой проблемы.

Как защитить управляющие элементы

Поставщики управляющих элементов VBX и OLE уже научились их защищать при помощи лицензионного файла. Так, управляющий элемент может быть использован разработчиком в своей программе, только когда лицензионный файл должным образом установлен в системе. Без этого файла управляющий элемент может функционировать только в составе готового исполняемого модуля.

Недостатком использования управляющих элементов в HTML-документах — по крайней мере, как это мне сейчас представляется — является то, что для использования в своей программе чужих компонентов вам не нужна специфическая среда разработки. HTML-страницы представляют собой “программы” с всегда доступным исходным текстом. И если вы использовали в своей Web-странице какой-то управляющий элемент ActiveX, то у меня всегда есть возможность вставить его в одну из моих собственных Web-страниц, независимо от наличия у меня лицензионного файла.

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

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

К предложенной схеме защиты вы могли бы добавить и собственные усовершенствования. Например, включить дату истечения срока использования, также защищенную кодом аутентификации, в лицензионный файл или параметры. Одним из аутентифицируемых параметров можно сделать строку URL Web-страницы, к которой принадлежит управляющий элемент, или IP-адрес Web-сервера, или IP-адрес клиентской сети и ее маску. Кроме того, поставку лицензионного файла, новых версий управляющего элемента и файла помощи можно осуществлять с защищенного Web-сервера, что сделает взлом схемы защиты управляющих элементов занятием трудным и более дорогостоящим, чем их покупка.

Чтобы вычислить код аутентификации, соедините все строки параметров и передайте полученную строку и некоторый ключ, представленный строкой или несколькими целыми значениями, в процедуру вычисления зашифрованной контрольной суммы (или CRC-кода), или в модуль шифрованного хэширования. Контрольную сумму или CRC-код вы можете вычислить с помощью одного из алгоритмов проверки целостности пакетов данных, используемых в таких популярных протоколах передачи файлов по последовательному порту, как Kermit или Zmodem. Предварительное шифрование строки перед вычислением контрольной суммы или шифрование самой контрольной суммы можно произвести с помощью любого надежного алгоритма шифрования. Возможно, для этого будет более чем достаточно мощного алгоритма шифрования в стандарте DES. Простые же XOR-алгоритмы, вероятно, будут слишком слабы, чтобы надолго защитить управляющие элементы.

В управляющих элементах ActiveX имеется больше возможностей использования лицензионной схемы, чем это может показаться на первый взгляд. Во время порождения экземпляра объекта малоизвестный алгоритм Microsoft проверяет факт установки управляющего элемента в контейнере (объекте, содержащем порожденный элемент. — Прим. ред.) с помощью лицензированной среды разработки. Я не очень представляю себе детали, очевидно, потому, что Microsoft не стремится подробно описать этот механизм, чтобы не оказать тем самым добрую услугу “взломщикам”. С другой стороны, ничто не может помешать поставщикам управляющих элементов применять мою схему аутентификации либо вместо, либо в дополнение к лицензионной схеме Microsoft. В последнем случае Microsoft обеспечит вас инструментарием, который позволит реализовать мою схему более эффективно.

Как обеспечить шифрование

Фирма Microsoft включила мощные алгоритмы хэширования и цифровой подписи RSA в свой криптографический интерфейс прикладных программ (Cryptographic Application Program Interface — CryptoAPI), который будет введен в состав ОС Windows NT 4.0 и будущую версию Windows 95. Поэтому вам не нужно будет растрачивать программный код управляющего элемента на реализацию алгоритма шифрования, если вы ограничитесь применением этих новых операционных систем.

В соответствии со схемой CryptoAPI, ваша программа начинает процесс шифрования, получая идентификатор (handle) криптографического сервиса с помощью вызова функции CryptAcquireContext. Базовым сервисом, или сервисом по умолчанию, является реализация компанией Microsoft методов шифрования по схеме открытого ключа фирмы RSA Data Security. Эти методы используют алгоритм RSA для обмена ключами и реализации цифровой подписи, алгоритмы RC2 и RC4 — для шифрования, а алгоритмы MD5 и SHA — для хэширования. RSA — это довольно мощный, но требующий большого объема вычислений алгоритм шифрования с открытым ключом, RC2 — 64-битовый симметричный блочный алгоритм шифрования, RC4 — симметричный поточный алгоритм шифрования. Алгоритмы MD5 и SHA служат для вычисления хэш-значений для блоков данных размером 128 бит в случае MD5 и 160 бит — для SHA.

Чтобы сгенерировать уникальный хэш-код для блока данных, необходимо сначала создать хэш-объект с помощью функции CryptCreateHash, и затем произвести собственно генерацию хэш-кода с помощью функции CryptHashData. После этого нужно либо утвердить уже существующую электронную подпись для данного хэш-объекта и его открытого ключа, используя функцию CryptVerifySignature, либо создать новую цифровую подпись с помощью функции CryptSignHash и вашего личного ключа. Механизм цифровой подписи следует использовать только для хэш-кода и никогда — для самих данных, поскольку алгоритм цифровой подписи с открытым ключом работает очень медленно. И наконец, необходимо уничтожить использованный ключ и хэш-объект, а также освободить идентификатор криптографического сервиса.

Немного о приятном

От этой “сухой” и трудной для восприятия темы я хотел бы перейти к моему любимому предмету обсуждения — языку Java. Фирма Microsoft включила интерпретатор Java в свой браузер Internet Explorer 3.0, который можно бесплатно получить через Internet. Это означает, что Java включен в Windows 95 и Windows NT. Но на сегодняшний день, пожалуй, более существенно, что интерпретатор Java уже является составной частью Netscape Navigator, наиболее широко распространенного Web-браузера.

Синтаксис Java в боўльшей степени базируется на языке Си++, а его библиотека стандартных классов напоминает мне библиотеку языка Smalltalk. Исходный код Java компилируется в байт-код (прекомпилированное состояние исполняемого модуля языка Java. — Прим. ред.) в среде разработки, а интерпретируется — или компилируется по технологии just-in-time (“как раз во время”) — на клиентской машине. Язык имеет несколько существенных преимуществ перед Си++ при использовании в Web-страницах. Во-первых, приложения достаточно малы и поэтому быстро загружаются по сети. Во-вторых, байт-код Java системно независим, и вам не надо создавать многочисленные версии для разных платформ. И наконец, библиотека классов Java очень богата и проста в использовании для большинства Web-приложений.

Приложения Java, так же как и управляющие элементы ActiveX, выполняются на клиентской машине при отображении текущей Web-страницы. Если данный Web-браузер поддерживает Java, он при необходимости “подкачает” байт-код приложения из сети. Java-приложения запускаются из HTML-текста с помощью соответствующей метки языка, например: <applet code= DrawTest.class width=400 height= 400></applet>.

Средства разработки на языке Java, компиляторы типа just-in-time и библиотеки классов третьих фирм еще весьма малочисленны и сильно отличаются друг от друга, но ситуация быстро меняется. Вот в книгах по программированию на языке Java недостатка нет, но есть ли среди них действительно полезные? Если я найду что-нибудь, то обязательно дам вам знать. По сути, Java — это один из диалектов Си++. Боўльшая часть того, что вы знаете о Си++, пригодится при работе с Java, исключение составляют препроцессор, указатели и множественное наследование (которые отсутствуют в Java. — Прим. ред.). Вместо препроцессора Java имеет оператор import, который добавляет внешний программный код или типы данных в текст Java-программы. Так называемые “пакеты” Java (packages) — инструмент для модульной организации исходного текста — используют иерархические имена. Звездочка в спецификации имени пакета означает, что компоненты пакета должны быть импортированы по мере необходимости. Так, оператор import java. awt.* импортирует в приложение только задействованные public-классы из иерархии пакетов Java Advanced Window Toolkit, в то время как оператор import java.util. Vector безусловно импортирует public-класс Vector из пакета java.util. Оператор package определяет место класса в иерархии. Например, исходный программный код класса Vector включает оператор package java.util, который предшествует в тексте программы заданию класса: public class Vector implements Cloneable.

Исходный код Java должен иметь расширение .java, а скомпилированный байт-код — расширение .class. Очевидно, что для выполнения этих правил именования операционная система должна поддерживать длинные имена файлов. Чтобы облегчить решение этой проблемы и сэкономить место на диске, вы можете держать классы в файлах .ZIP. Переменная среды CLASSPATH указывает, где находятся классы. Существуют и другие переменные среды, которые определяют расположение дерева каталогов Java, задействованных в разработке. Вместо множественного наследования в язык Java включены понятия interface и implementation. Класс Vector, например, при помощи интерфейса Cloneable расширяет класс Object, т. е. является производным от универсального базового класса Object. Классы Java могут реализовывать сразу несколько интерфейсов, но при этом способны расширять лишь единственный суперкласс — своего непосредственного предка.

Классы Java содержат поля, являющиеся переменными или методами. Поля могут быть открытыми (public), защищенными (protected) или закрытыми (private). Методы могут быть объявлены статическими (static), в этом случае они оперируют классом, в противном случае они оперируют экземпляром класса. Методы могут иметь спецификации abstract, final, native или synchronized. Абстрактные (abstract) методы, принадлежащие абстрактным классам, не имеют реализации; все неабстрактные производные классы обязаны реализовывать эти методы. Методы final не могут быть перекрыты.

Метод native реализуется на некотором языке, отличном от Java, обычно на Си++ или Ассемблере. Синхронизированные (synchronized) методы перед началом выполнения блокируют экземпляр объекта, — причем этот экземпляр может использоваться только одной нитью программы (thread). Синхронизация разных нитей может быть также выполнена вручную с помощью оператора synchronized. Если объект занят, блокировка будет отложена до тех пор, пока он не освободится. Исключительные ситуации в Java обрабатываются при помощи конструкции try/ Catches/Finally.

Если вы уже начали осознавать, что Java — это достаточно мощный язык, несмотря на несерьезность большинства приложений Java, встречающихся в Internet, то добро пожаловать в наш клуб программистов на языке Java. Учтите, что в своем рассказе я даже не коснулся всего богатства возможностей и элегантности построения многих классов Java фирмы Sun, модели обработки событий в Java-приложениях, а также не упомянул о некоторых необычных членах иерархии классов Java. Действительно, у разработчиков Java есть куча идей, среди которых довольно много хороших. Кажется, мне нравятся эти парни.


распечатать статью




  
10 '1996
СОДЕРЖАНИЕ

колонка редактора

• Лучше меньше да лучше

локальные сети

• Гонки по дорогам Fast Ethernet: обзор коммутаторов и концентраторов

• Основы построения структурированной кабельной системы. Часть II

• Ручные анализаторы ЛВС

корпоративные сети

• Мосты, маршрутизаторы, коммутаторы: здравый смысл и “собака”, которая не лаяла

• На границе с АТМ

• Серверы протокола DHCP

• Когда мы едины, мы непобедимы

услуги сетей связи

• Сеть управления электросвязью (TMN)

• АТМ и Frame Relay: обещания и реалии

• Выбор технологии для сельской системы связи

интернет и интрасети

• Портативные аппаратные средства узла Web

• Совместное использование файлов в Windows 95 через Internet

приложения клиент-сервер

• Windows 95 и системы управления документами

• Организация доступа к СУБД через Web-сервер

защита данных

• Организация резервного копирования в локальных и корпоративных сетях

• Беспатные советы по защите от пиратов

• Защита данных в Windows 95

новые продукты

• Цифровая телефонная станция Introworks, Synthesis: “чистота” и эффективность, BusinessPhone фирмы Ericsson, SMC представляет новые продукты Fast Ethernet, Осенняя коллекция IBM, Новые продукты Cabletron



 Copyright © 1997-2007 ООО "Сети и Системы Связи". Тел. (495) 234-53-21. Факс (495) 974-7110. вверх