Что такое электронный ключ. Защита с помощью автоматических средств. Аппаратные средства поддержки криптографических механизмов

В этой статье описаны способы обхода аппаратных систем защиты. В качестве примера рассмотрена технология HASP (Hardware Against Software Piracy), разработанная компанией Aladdin Knowledge Systems Ltd. В прошлом данная технология являлась одной из самых популярных аппаратных систем защиты ПО.

Мощью аппаратной защиты HASP пользуются многие серьезные разработчики софта, которые не хотят, чтобы их продукт несанкционированно распространялся. Хаспом, например, защищаются пакеты «1С.Бухгалтерия» или «1С.Предприятие», без которых не может прожить ни одно более или менее организованное дело. Популярный юридический справочник «КонсультантПлюс» также защищает доступ к данным с помощью электронных ключиков. Чтобы воспользоваться вышеупомянутым или другим не менее дорогостоящим софтом, не платя никому ни копейки, недостаточно просто полазить по Сети в поисках txt’шника с ключиками. Однако хакер всегда разберется, что делать с защитой, пусть и аппаратной. И паяльник ему для этого не понадобится.

Взглянем

Утрируя, можно сказать, что HASP состоит из двух частей: аппаратной и программной. Аппаратная часть - это электронный ключик в виде USB-брелка, PCMCIA-карты, LTP-девайса или вообще внутренней PCI-карты. Установленный софт будет работать только на той машине, в которую воткнут электронный ключ. Собственно, неплохо было бы отучить софт от такой неприятной для кошелька привычки.

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

Механизм системы защиты

Сам брелок нас почти не интересует, в отличие от ПО в его комплекте. Для нас наибольший интерес представляет модуль hardlock.sys. Не углубляясь в подробности, отмечу, что этот драйвер отвечает за взаимодействие с аппаратным ключом. Он имеет два объекта устройства, один из которых обладает символьным именем DeviceFNT0. Используя этот объект, защищенное приложение посредством диспетчера ввода-вывода проверяет лицензию на использование данного ПО.

Главным недостатком такой системы защиты является возможность перехвата вызовов диспетчера ввода-вывода и эмулирования аппаратного ключа. Существует также вариант разработки драйвера виртуального ключа, но это гораздо более сложная техническая задача, нежели перехват вызовов.
Как тебе известно, модель драйвера описывается в структуре DRIVER_OBJECT при загрузке модуля. Она хранит массив обработчиков сообщений. Причем никто не мешает переписать эти адреса и получить управление, выполнив наш код. Таким образом, можно перехватывать и подменять IRP-пакеты, подставляя лицензионные данные. Другими словами, имея дамп ключа защиты, можно передать его программе, проверяющей верность лицензионных данных!

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

Перехват и эмуляция

Как уже отмечалось, идея перехвата состоит в перезаписи обработчиков IRP-пакетов. Для этого необходимо иметь возможность изменять поля структуры DRIVER_OBJECT. К счастью, существует функция IoGetDevicePointer, которая возвращает указатель на объект вершины стека именованных устройств и указатель на соответствующий файловый объект. Вот фрагмент кода функции, устанавливающей ловушку:

UNICODE_STRING DeviceName;
PDEVICE_OBJECT DeviceObject;
PFILE_OBJECT FileObject;

RtlInitUnicodeString(&DeviceName, lpDevice);
IoGetDeviceObjectPointer(&DeviceName, 1u, &FileObject, &DeviceObject);

Получив указатель на структуру DEVICE_OBJECT, имеем указатель на DRIVER_OBJECT. Теперь заменим адреса обработчиков и функций выгрузки драйвера на свои:

NTSTATUS HookDevice(LPWSTR lpDevice)

gDriverObject = DeviceObject-> DriverObject;

gDeviceControl = gDriverObject-> MajorFunction;
gDriverObject-> MajorFunction = HookDispatch;

gInternalDeviceControl = gDriverObject-> MajorFunction;
gDriverObject-> MajorFunction = HookDispatch;

gDriverUnload = gDriverObject->DriverUnload;
gDriverObject->DriverUnload = HookUnload;

ObfDereferenceObject(FileObject);

В последней строчке вызывается функция ObfDereferenceObject, которая уменьшает количество ссылок на файловый объект. Это необходимо делать для корректной выгрузки драйвера, чтобы не было утечки ресурсов и аналогичных ошибок.

Так как указатель на объект драйвера защиты сохранeн, то чтобы снять ловушку, нужно просто восстановить прежние обработчики IRP-пакетов:

void UnhookDevice(void)

gDriverObject-> MajorFunction = gDeviceControl;
gDriverObject-> MajorFunction = gInternalDeviceControl;
gDriverObject->DriverUnload = gDriverUnload;

Конечно, надо добавить соответствующие проверки на валидность указателей и прочее.

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

void HookUnload(PDRIVER_OBJECT DrvObj)

UnhookDevice();
gDriverUnload(DrvObj);

Здесь происходит восстановление полей структуры DRIVER_OBJECT, и передаeтся управление на оригинальный код выгрузки драйвера перехваченного устройства.

Аналогично поступаем, если наш драйвер завершает работу раньше системы защиты. Только нужно высвободить захваченные ресурсы и не вызывать сохранeнный gHookUnload.

Принцип работы эмулятора

Перехватчик

Зная основные принципы простейшего перехвата IRP-пакетов, приступим к реализации пока только самого перехватчика для дальнейшего анализа. Для этого создадим объект драйвера, который содержит символьное имя (например DosDevicesHook) и точки входа CREATE, CLOSE, READ.

IoCreateDevice(DriverObject, 0, &usDeviceName, FILE_DEVICE_NULL, 0, 0, &pDeviceObject);
IoCreateSymbolicLink(&usSymbolicDeviceName, &usDeviceName);

DriverObject->MajorFunction = DriverDispatch;
DriverObject->MajorFunction = DriverDispatch;
DriverObject->MajorFunction = DriverDispatch;
DriverObject->DriverUnload = DriverUnload;

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

Код HookDispatch

if (idlTail->IrpData.InputLength)
{
idlTail->InputBuffer = ExAllocatePool(NonPagedPool, idlTail->IrpData.InputLength);
RtlCopyMemory(idlTail->InputBuffer, Irp->AssociatedIrp.SystemBuffer, idlTail->IrpData.InputLength);
}

if (IoSL->MajorFunction == IRP_MJ_DEVICE_CONTROL)
Status = pHookedDriverDispatch(DeviceObject, Irp);

if (idlTail->IrpData.OutputLength)
{
idlTail->OutputBuffer = ExAllocatePool(NonPagedPool, idlTail-> IrpData.OutputLength);
RtlCopyMemory(idlTail->OutputBuffer, lpBuffer, idlTail->IrpData.OutputLength);
}

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

Код DriverDispatch

Length = IoSL->Parameters.Read.Length;
if (Length == sizeof(IRP_DATA) && idlHead)
RtlCopyMemory(Irp->UserBuffer, &idlHead->IrpData, Length);
else if (idlHead && Length == (idlHead-> IrpData.InputLength + idlHead-> IrpData.OutputLength))
{
RtlCopyMemory(Irp->UserBuffer, idlHead-> InputBuffer, idlHead->IrpData.InputLength);
RtlCopyMemory((PVOID)((ULONG)Irp->UserBuffer + idlHead->IrpData.InputLength), idlHead-> OutputBuffer, idlHead->IrpData.OutputLength);
}
else if (Length == 1 && idlHead)
{
if (idlHead->InputBuffer)
ExFreePool(idlHead->InputBuffer);
if (idlHead->OutputBuffer)
ExFreePool(idlHead->OutputBuffer);

idlTemp = idlHead->ldlNext;
ExFreePool(idlHead);
idlHead = idlTemp;
if (!idlTemp)
idlTail = NULL;
}

Когда перехватчик готов, запускаем сначала его, а затем - защищенное приложение с ключами и без. Из полученных логов становится видно, какие управляющие коды посылаются и их результаты. Также можно видеть, что запросы и ответы на два различных кода (9c402450, 9c4024a0) не изменяются. Казалось бы, можно построить табличный эмулятор, но после серии запусков убеждаемся, что это невозможно, так как содержимое буферов различно, и неизвестно, как оно образуется.

Перехваченные пакеты без ключа

Перехваченные пакеты с ключом

Затем возможны несколько вариантов дальнейших действий:

  • изучать дебри драйвера защиты;
  • воспользоваться информацией самих разработчиков системы.

Оба варианта дают необходимую информацию. Итак, оказывается, содержимое пакетов шифруется публичным симметричным алгоритмом AES (Advanced Encryption Standard). Логичной целью является получение ключа шифрования.

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

Пример дампа ключа

Поэтому первое, что нужно сделать, это получить ключ. Поставленную задачу может решить обычный брутфорс:

unsigned short Key;
unsigned char RefKey, VerKey;

for (Key = 0; Key <= 0x7fff, Key++)
{
if (!HL_LOGIN(Key, 1, RefKey, VerKey))
{
HL_LOGOUT();
Break;
}
}

Функции HL_LOGIN, HL_LOGOUT доступны из HASP SDK для разработчиков приложений, защищенных на этой платформе, и имеют следующие прототипы:

WORD HL_LOGIN(WORD ModAd, Word Access, Byte *RefKey, Byt *VerKey);
WORD HL_LOGOUT(void);

Первая функция служит для открытия сессии работы с ключом защиты посредством драйвера, вторая – завершает сессию. Это прототипы старых версий HASP SDK, но работают они и с новыми типами ключей, так как разработчики обеспечили обратную совместимость.

Новый API мало отличается от старого, и это никак не сказывается на принципе работы брутфорса. Подробную документацию Hasp API, готовые реализации брутфорса и дампера ключей можно найти на .

Обработчик

Теперь есть все необходимое для корректной работы модуля. Осталось реализовать подстановку лицензионной информации. Причем можно перехватывать лишь некоторые IRP-пакеты. Здесь все уже зависит от конкретной версии ключа и защищаемой программы.

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

NTSTATUS HookDispatch():

PIO_STACK_LOCATION Stack = Irp-> Tail.Overlay.CurrentStackLocation;
ULONG IoControlCode;
if (Stack->MajorFunction == 14)
{
IoControlCode = Stack.DeviceIoControl.IoControlCode;
If (IoControlCode != 0x9c402458)
{
Return gDeviceControl(DeviceObject, Irp);
}
else
{
Encrypt(Irp->AssociatedIrp.SystemBuffer);
Crypt(Irp->AssociatedIrp.SystemBuffer, Key, DumpMemory);
}
}

Return STATUS_FAILED;

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

Код Encrypt()

void Encrypt(BYTE * Buffer)
{
WORD Seed = ((WORD )Buffer + 0x5e);
WORD Ver = ((WORD )Buffer + 0xba);

if (Ver)
{
for (int i = 0; i < 0xB9; i++) {
(WORD )(Buffer + i) += Seed;
Seed = (Seed >> 15) | (Seed << 1);
Seed -= (WORD )(Buffer + i) ^ i;
}

for (int i = 0xBE; i < 0xFF; i++) {
(WORD )(Buffer + i) -= Seed;
Seed = (Seed >> 15) | (Seed << 1);
Seed += (WORD )(Buffer + i) ^ i;
}

((WORD )Buffer + 0xba) = Seed;
}
}

Видно, что алгоритм гораздо сложнее, чем обычный сдвиг и исключающее «или». А вот алгоритм дешифрования:

Код Decrypt()

void Decrypt(BYTE* Buffer)
{
WORD Seed = ((WORD )Buffer + 0x5e);
WORD Ver = ((WORD )Buffer + 0xba);

if (Ver) {
for (int i = 0xFE; i > 0xBD; i—) {
Seed -= (WORD )(Buffer + i) ^ i;
Seed = (Seed << 15) | (Seed >> 1);
(WORD )(Buffer + i) += Seed;
}

for (int i = 0xB8; i >= 0; i—) {
Seed += (WORD )(Buffer + i) ^ i;
Seed = (Seed << 15) | (Seed >> 1);
(WORD )(Buffer + i) -= Seed;
}

((WORD )Buffer + 0xba) = Seed;
}
}

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

В заключение отмечу, что построение табличного эмулятора, основанного на перехвате DeviceIoControl, - достаточно трудная задача. Но такой принцип эмулятора можно использовать и на другом уровне взаимодействия: создать виртуальную USB-шину.

Заключение

Это не единственный способ избавиться от системы защиты. Существуют и другие, более совершенные методы. Изложенные в статье принципы можно использовать и для анализа работы драйверов, перехватывая IRP-пакеты. Таким образом можно добавить неплохой инструмент в свой сделанный на коленке набор. Удачи!

Алгоритмов), часы реального времени. Аппаратные ключи могут иметь различные форм-факторы , но чаще всего они подключаются к компьютеру через USB . Также встречаются с LPT - или PCMCIA -интерфейсами.

Принцип действия электронных ключей . Ключ присоединяется к определённому интерфейсу компьютера. Далее защищённая программа через специальный драйвер отправляет ему информацию, которая обрабатывается в соответствии с заданным алгоритмом и возвращается обратно. Если ответ ключа правильный, то программа продолжает свою работу. В противном случае она может выполнять определенные разработчиками действия, например, переключаться в демонстрационный режим, блокируя доступ к определённым функциям.

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

Энциклопедичный YouTube

    1 / 4

    Arduino NFC EEPROM электронный ключ RC522 Card Read Module RFID OLED LCD Display

    Arduino NFC билет Метро электронный ключ RC522 Card Read Module RFID Servo

    А. Пурнов. Зачем нужен электронный ключ от терминала? (трейдинг, биржевая торговля, игра на бирже)

    Как оплатить и активировать электронный ключ в PRAV.TV

    Субтитры

История

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

Эти очевидные недостатки привели к созданию аппаратной защиты программного обеспечения в виде электронного ключа. Известно, что первые электронные ключи (то есть аппаратные устройства для защиты ПО от нелегального копирования) появились в начале 1980-х годов, однако первенство в идее и непосредственном создании устройства, по понятным причинам, установить очень сложно.

Защита ПО с помощью электронного ключа

Комплект разработчика ПО

Донгл относят к аппаратным методам защиты ПО, однако современные электронные ключи часто определяются как мультиплатформенные аппаратно-программные инструментальные системы для защиты ПО. Дело в том, что помимо самого ключа компании, выпускающие электронные ключи, предоставляют SDK (Software Developer Kit - комплект разработчика ПО). В SDK входит все необходимое для начала использования представляемой технологии в собственных программных продуктах - средства разработки, полная техническая документация , поддержка различных операционных систем , детальные примеры, фрагменты кода, инструменты для автоматической защиты. Также SDK может включать в себя демонстрационные ключи для построения тестовых проектов.

Технология защиты

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

  • проверка наличия подключения ключа;
  • считывание с ключа необходимых программе данных в качестве параметра запуска (используется, в основном, только при поиске подходящего ключа, но не для защиты);
  • запрос на расшифрование данных или исполняемого кода, необходимых для работы программы, зашифрованных при защите программы (позволяет осуществлять "сравнение с эталоном"; в случае шифрования кода, выполнение нерасшифрованного кода приводит к ошибке);
  • запрос на расшифрование данных, зашифрованных ранее самой программой (позволяет отправлять каждый раз разные запросы к ключу и, тем самым, защититься от эмуляции библиотек API / самого ключа)
  • проверка целостности исполняемого кода путём сравнения его текущей контрольной суммы с оригинальной контрольной суммой, считываемой с ключа (к примеру, путем выполнения ЭЦП кода или других переданных данных алгоритмом ключа и проверки этой ЭЦП внутри приложения; т.к. ЭЦП всегда разная - особенность криптографического алгоритма - то это также помогает защититься от эмуляции API/ключа);
  • запрос к встроенным в ключ часам реального времени (при их наличии; может осуществляться автоматически при ограничении времени работы аппаратных алгоритмов ключа по его внутреннему таймеру);
  • и т.д.

Стоит отметить, что некоторые современные ключи (Guardant Code от Компании "Актив", LOCK от Astroma Ltd., Rockey6 Smart от Feitian, Senselock от Seculab) позволяют разработчику хранить собственные алгоритмы или даже отдельные части кода приложения (например, специфические алгоритмы разработчика, получающие на вход большое число параметров) и исполнять их в самом ключе на его собственном микропроцессоре . Помимо защиты ПО от нелегального использования такой подход позволяет защитить используемый в программе алгоритм от изучения, клонирования и использования в своих приложениях конкурентами. Однако для простого алгоритма (а разработчики часто совершают ошибку, выбирая для загрузки недостаточно сложный алгоритм) может быть проведен криптоанализ по методу анализа "черного ящика".

Как следует из вышесказанного, «сердцем» электронного ключа является алгоритм преобразования (криптографический или другой). В современных ключах он реализован аппаратно - это практически исключает создание полного эмулятора ключа, так как ключ шифрования никогда не передается на выход донгла, что исключает возможность его перехвата.

Алгоритм шифрования может быть секретным или публичным. Секретные алгоритмы разрабатываются самим производителем средств защиты, в том числе и индивидуально для каждого заказчика. Главным недостатком использования таких алгоритмов является невозможность оценки криптографической стойкости . С уверенностью сказать, насколько надёжен алгоритм, можно было лишь постфактум: взломали или нет. Публичный алгоритм, или «открытый исходник», обладает криптостойкостью несравнимо большей. Такие алгоритмы проверяются не случайными людьми, а рядом экспертов, специализирующихся на анализе криптографии . Примерами таких алгоритмов могут служить широко используемые ГОСТ 28147-89 , AES , RSA , Elgamal и др.

Защита с помощью автоматических средств

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

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

Реализация защиты с помощью функций API

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

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

Обход защиты

Информации о полной эмуляции современных ключей Guardant не встречалось. Существующие табличные эмуляторы реализованы только для конкретных приложений. Возможность их создания была обусловлена неиспользованием (или неграмотным использованием) основного функционала электронных ключей разработчиками защит.

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

Взлом программного модуля

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

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

Дизассемблирование - способ преобразования кода исполняемых модулей в язык программирования, понятный человеку - Assembler . В этом случае злоумышленник получает распечатку (листинг) того, что делает приложение.

Декомпиляция - преобразование исполняемого модуля приложения в программный код на языке высокого уровня и получение представления приложения, близкого к исходному коду. Может быть проведена только для некоторых языков программирования (в частности, для.NET приложений, создаваемых на языке C# и распространяемых в байт-коде - интерпретируемом языке относительно высокого уровня).

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

Отметим, что существует немало способов противодействия отладке, и разработчики защиты используют их: нелинейность кода, (многопоточность), недетерминированную последовательность исполнения, «замусоривание» кода, (бесполезными функциями, выполняющими сложные операции, с целью запутать злоумышленника), использование несовершенства самих отладчиков и др.

Имеющие уникальные для каждого ключа алгоритмы работы. Донглы также имеют защищённую энергонезависимую память небольшого объёма, более сложные устройства могут иметь встроенный криптопроцессор (для аппаратной реализации шифрующих алгоритмов), часы реального времени. Аппаратные ключи могут иметь различные форм-факторы , но чаще всего они подключаются к компьютеру через USB . Также встречаются с LPT - или PCMCIA -интерфейсами.

Принцип действия электронных ключей . Ключ присоединяется к определённому интерфейсу компьютера. Далее защищённая программа через специальный драйвер отправляет ему информацию, которая обрабатывается в соответствии с заданным алгоритмом и возвращается обратно. Если ответ ключа правильный, то программа продолжает свою работу. В противном случае она может выполнять определенные разработчиками действия, например, переключаться в демонстрационный режим, блокируя доступ к определённым функциям.

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

История

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

Эти очевидные недостатки привели к созданию аппаратной защиты программного обеспечения в виде электронного ключа. Известно, что первые электронные ключи (то есть аппаратные устройства для защиты ПО от нелегального копирования) появились в начале 1980-х годов, однако первенство в идее и непосредственном создании устройства, по понятным причинам, установить очень сложно.

Защита ПО с помощью электронного ключа

Комплект разработчика ПО

Донгл относят к аппаратным методам защиты ПО, однако современные электронные ключи часто определяются как мультиплатформенные аппаратно-программные инструментальные системы для защиты ПО. Дело в том, что помимо самого ключа компании, выпускающие электронные ключи, предоставляют SDK (Software Developer Kit - комплект разработчика ПО). В SDK входит все необходимое для начала использования представляемой технологии в собственных программных продуктах - средства разработки, полная техническая документация , поддержка различных операционных систем , детальные примеры, фрагменты кода, инструменты для автоматической защиты. Также SDK может включать в себя демонстрационные ключи для построения тестовых проектов.

Технология защиты

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

  • проверка наличия подключения ключа;
  • считывание с ключа необходимых программе данных в качестве параметра запуска (используется, в основном, только при поиске подходящего ключа, но не для защиты);
  • запрос на расшифрование данных или исполняемого кода, необходимых для работы программы, зашифрованных при защите программы (позволяет осуществлять "сравнение с эталоном"; в случае шифрования кода, выполнение нерасшифрованного кода приводит к ошибке);
  • запрос на расшифрование данных, зашифрованных ранее самой программой (позволяет отправлять каждый раз разные запросы к ключу и, тем самым, защититься от эмуляции библиотек API / самого ключа)
  • проверка целостности исполняемого кода путём сравнения его текущей контрольной суммы с оригинальной контрольной суммой, считываемой с ключа (к примеру, путём выполнения ЭЦП кода или других переданных данных алгоритмом ключа и проверки этой ЭЦП внутри приложения; т.к. ЭЦП всегда разная - особенность криптографического алгоритма - то это также помогает защититься от эмуляции API/ключа);
  • запрос к встроенным в ключ часам реального времени (при их наличии; может осуществляться автоматически при ограничении времени работы аппаратных алгоритмов ключа по его внутреннему таймеру);
  • и т.д.

Стоит отметить, что некоторые современные ключи (Guardant Code от Компании "Актив", LOCK от Astroma Ltd., Rockey6 Smart от Feitian, Senselock от Seculab) позволяют разработчику хранить собственные алгоритмы или даже отдельные части кода приложения (например, специфические алгоритмы разработчика, получающие на вход большое число параметров) и исполнять их в самом ключе на его собственном микропроцессоре . Помимо защиты ПО от нелегального использования такой подход позволяет защитить используемый в программе алгоритм от изучения, клонирования и использования в своих приложениях конкурентами. Однако для простого алгоритма (а разработчики часто совершают ошибку, выбирая для загрузки недостаточно сложный алгоритм) может быть проведен криптоанализ по методу анализа "черного ящика".

Как следует из вышесказанного, «сердцем» электронного ключа является алгоритм преобразования (криптографический или другой). В современных ключах он реализован аппаратно - это практически исключает создание полного эмулятора ключа, так как ключ шифрования никогда не передается на выход донгла, что исключает возможность его перехвата.

Алгоритм шифрования может быть секретным или публичным. Секретные алгоритмы разрабатываются самим производителем средств защиты, в том числе и индивидуально для каждого заказчика. Главным недостатком использования таких алгоритмов является невозможность оценки криптографической стойкости . С уверенностью сказать, насколько надёжен алгоритм, можно было лишь постфактум: взломали или нет. Публичный алгоритм, или «открытый исходник», обладает криптостойкостью несравнимо большей. Такие алгоритмы проверяются не случайными людьми, а рядом экспертов, специализирующихся на анализе криптографии . Примерами таких алгоритмов могут служить широко используемые ГОСТ 28147-89 , AES , RSA , Elgamal и др.

Защита с помощью автоматических средств

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

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

Реализация защиты с помощью функций API

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

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

Обход защиты

Информации о полной эмуляции современных ключей Guardant не встречалось. Существующие табличные эмуляторы реализованы только для конкретных приложений. Возможность их создания была обусловлена неиспользованием (или неграмотным использованием) основного функционала электронных ключей разработчиками защит.

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

Взлом программного модуля

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

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

Дизассемблирование - способ преобразования кода исполняемых модулей в язык программирования, понятный человеку - Assembler . В этом случае злоумышленник получает распечатку (листинг) того, что делает приложение.

Декомпиляция - преобразование исполняемого модуля приложения в программный код на языке высокого уровня и получение представления приложения, близкого к исходному коду. Может быть проведена только для некоторых языков программирования (в частности, для.NET приложений, создаваемых на языке C# и распространяемых в байт-коде - интерпретируемом языке относительно высокого уровня).

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

Отметим, что существует немало способов противодействия отладке, и разработчики защиты используют их: нелинейность кода, (многопоточность), недетерминированную последовательность исполнения, «замусоривание» кода, (бесполезными функциями, выполняющими сложные операции, с целью запутать злоумышленника), использование несовершенства самих отладчиков и др.

(ПО) и данных от копирования, нелегального использования и несанкционированного распространения.

Электронный ключ - небольшое по размерам аппаратное устройство.

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

Установка ключа

После присоединения ключа к порту запустится стандартный Мастер нового оборудования. операционная система будет осведомлена о данном классе оборудования, что подтвердится наличием в консоли Мастера названия ключа Guardant Stealth/Net USB Key. После поиска и конфигурирования Мастер сообщит, что драйверы не подписаны корпорацией Майкрософт и предложит отказаться от установки. Для продолжения установки драйверов необходимо выбрать опцию “Всё равно продолжить” , после чего установка драйверов будет завершена.

Принцип действия электронных ключей таков.

Ключ присоединяется к определённому интерфейсу компьютера. Далее защищённая программа через специальный драйвер отправляет ему информацию, которая обрабатывается в соответствии с заданным алгоритмом и возвращается обратно. Если ответ ключа правильный, то программа продолжает свою работу. В противном случае она может выполнять любые действия, заданные разработчиками - например, переключаться в демонстрационный режим, блокируя доступ к определённым функциям.

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

Многие компании, работающие в области защиты информации , предлагают свой взгляд на то, каким должен быть электронный ключ. На российском рынке наиболее известны следующие линейки продуктов (в алфавитном порядке): CodeMeter от WIBU-SYSTEMS, Guardant от компании «Актив», HASP от Aladdin, LOCK от Astroma Ltd., Rockey от Feitian, SenseLock от Seculab, Sentinel от SafeNet и др.

История

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

Эти очевидные недостатки привели к созданию аппаратной защиты программного обеспечения в виде электронного ключа. Известно, что первые электронные ключи (то есть аппаратные устройства для защиты ПО от нелегального копирования) появились в начале 1980ых годов, однако первенство в идее и непосредственном создании устройства по понятным причинам установить очень сложно.

Защита ПО с помощью электронного ключа

^ Комплект разработчика ПО

Донгл относят к аппаратным методам защиты ПО, однако современные электронные ключи часто определяются как мультиплатформенные аппаратно-программные инструментальные системы для защиты ПО. Дело в том, что помимо самого ключа компании, выпускающие электронные ключи, предоставляют SDK (Software Developer Kit - комплект разработчика ПО). В SDK входит все необходимое для начала использования представляемой технологии в собственных программных продуктах - средства разработки, полная техническая документация , поддержка различных операционных систем , детальные примеры, фрагменты кода. Также SDK может включать в себя демонстрационные ключи для построения тестовых проектов.

^ Технология защиты

Технология защиты от несанкционированного использования ПО построена на реализации запросов из исполняемого файла или динамической библиотеки к ключу с последующим получением ответа (и, если предусмотрено, анализом этого ответа). Вот некоторые характерные запросы :


  • проверка наличия подключения ключа;

  • считывание с ключа необходимых программе данных в качестве параметра запуска;

  • запрос на расшифрование данных или исполняемого кода, необходимых для работы программы (предварительно разработчик защиты шифрует часть кода программы и, понятно, непосредственное выполнение такого зашифрованного кода приводит к ошибке);

  • проверка целостности исполняемого кода путём сравнения его текущей контрольной суммы с оригинальной контрольной суммой, считываемой с ключа;

  • запрос к встроенным в ключ часам реального времени (при их наличии) и т. д.
Стоит отметить, что некоторые современные ключи (ключи Senselock от Seculab, Rockey6 Smart от Feitian, Guardant Code от Компании Актив) позволяют разработчику хранить отдельные части кода приложения (например, недетерминированные специфические алгоритмы разработчика, получающие на вход большое число параметров) и исполнять их в самом ключе на его собственном микропроцессоре . Помимо защиты ПО от нелегального использования такой подход позволяет защитить используемый в программе алгоритм от изучения и клонирования конкурентами. Однако простой алгоритм (а большинство из тех, что можно туда поместить именно таких) можно успешно криптоанализировать по методу анализа "черного ящика".

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

Алгоритм шифрования может быть секретным или публичным. Секретные алгоритмы разрабатываются самим производителем средств защиты, в том числе и индивидуально для каждого заказчика. Главным недостатком использования таких алгоритмов является невозможность оценки криптографической стойкости . С уверенностью сказать, насколько надёжен алгоритм, можно было лишь постфактум: взломали или нет. Публичный алгоритм, или «открытый исходник», обладает криптостойкостью несравнимо большей. Такие алгоритмы проверяются не случайными людьми, а рядом экспертов, специализирующихся на анализе криптографии . Примерами таких алгоритмов могут служить широко используемые ГОСТ 28147-89 , AES , RSA , Elgamal и др.

^ Обход защиты

Задача злоумышленника - заставить защищённую программу работать в условиях отсутствия легального ключа, подсоединённого к компьютеру. Не вдаваясь очень глубоко в технические подробности, будем исходить из предположения, что у злоумышленника есть следующие возможности:


  • Перехватывать все обращения к ключу;

  • Протоколировать и анализировать эти обращения;

  • Посылать запросы к ключу и получать на них ответы;

  • Протоколировать и анализировать эти ответы;

  • Посылать ответы от имени ключа и др.
Такие широкие возможности противника можно объяснить тем, что он имеет доступ ко всем открытым интерфейсам , документации , драйверам и может их анализировать на практике с привлечением любых средств.

Для того чтобы заставить программу работать так, как она работала бы с ключом, можно или внести исправления в программу (взломать её программный модуль ), или эмулировать наличие ключа.

^ Эмуляция ключа

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

Построить полный эмулятор современного электронного ключа - это достаточно трудоёмкий процесс, требующий большого количества времени и существенных инвестиций. Ранее злоумышленникам это удавалось: например, компания Aladdin признаёт, что в 1999 году злоумышленникам удалось разработать довольно корректно работающий эмулятор ключа HASP3. Это стало возможным благодаря тому, что алгоритмы кодирования были реализованы программно. Аппаратная реализация кодирования существенно усложнила задачу, поэтому злоумышленники предпочитают атаковать какой-то конкретный защищённый продукт, а не защитный механизм в общем виде. Тем не менее взлому были подвержены и ключи серии HASP4. И по сей день в природе имеются эмуляторы для HASP HL (HASP 5), но не в так называемом «паблике» (публичном доступе).

^ Взлом программного модуля

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

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

Дизассемблирование - это способ преобразования исполняемых модулей в язык программирования, понятный человеку - Assembler . В этом случае злоумышленник получает распечатку (листинг ) того, что делает приложение.

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

Отметим, что существует немало способов противодействия отладке, и разработчики защиты используют их: нелинейность кода (многопоточность ), «замусоривание» кода, по сути, бесполезными функциями, выполняющими сложные операции, с целью запутать злоумышленника, использование несовершенства самих отладчиков и др.

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

Аппаратные решения:

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

Аппаратное шифрование

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

Достоинства аппаратного шифрования

Аппаратные шифраторы имеют ряд достоинств:

  • формируют надёжные ключи шифрования и ЭЦП - аппаратный датчик случайных чисел создаёт действительно случайные числа,
  • сохраняют целостность алгоритма - она гарантируется аппаратной реализацией,
  • шифруют и хранят ключей осуществляются в самой плате шифратора - это затрудняет доступ,
  • загружают ключей в шифрующее устройство с электронных ключей Touch Memory (i-Button) и смарт-карт напрямую, а не через системную шину компьютера и ОЗУ - это исключает возможность перехвата ключей,
  • позволяют реализовать системы разграничения доступа к компьютеру,
  • применяют специализированный процессор для выполнения всех вычислений - это разгружает центральный процессор компьютера,
  • предусматривают возможность использования парафазных шин - это исключает угрозу чтения ключевой информации по колебаниям электромагнитного излучения при создании шифрпроцессора.
  • могут использоваться необученным человеком - шифровальное устройство элементарно подключается к компьютеру или модему, в то время как незаметное внедрение функций шифрования в ОС - достаточно трудоёмкий процесс, осуществляемый профессионалами.

Аппаратные средства поддержки криптографических механизмов

Существуют различные устройства, поддерживающие криптографические механизмы.

Устройства аппаратного шифрования

Современный рынок предлагает 3 разновидности аппаратных средств шифрования информации потенциальным покупателям.

Блоки шифрования

Представляют собой встраиваемые в каналы связи оконечные устройства - шифрующие аппаратные средства.

Самодостаточные шифровальные модули

Самодостаточные шифровальные модули самостоятельно выполняют всю работу с ключами. Например, usb-устройство ruToken, ПСКЗИ ШИПКА.

Шифровальные платы расширения

Рисунок 1 - Структура реальной шифровальной платы расширения

Классический вариант аппаратного шифратора для персонального компьютера - плата расширения, вставляемая в слот PCI системной платы ПК. Как правило, в состав аппаратного шифратора входят блок управления, шифропроцессор, аппаратный датчик случайных чисел, контроллер, микросхемы памяти, переключатели режимов работы и интерфейсы для подключения ключевых носителей .

Дополнительные возможности аппаратных шифраторов

Достаточно часто аппаратным шифраторам добавляют дополнительные функции, чтобы отчасти оправдать их высокую стоимость.
Например:

  • Генератор случайных чисел. Он необходим в основном для генерации криптографических ключей, но и не только - например, при вычислении подписи в соответствии с ГОСТ Р 34.10 - 2001 используется каждый раз новое случайное число.
Представляет собой контроль входа на компьютер. Каждый раз, когда пользователь включает персональный компьютер, устройство будет требовать от него ввода персональной информации - например, вставить токен. Загрузка системы продолжится только в случае, если устройство распознает предоставленные ключи и сочтёт их «своими».
  • Контроль целостности файлов операционной системы. Шифратор хранит в своей памяти перечень всех важных файлов с заранее посчитанными для каждого контрольными суммами (или хэш-значениями), и компьютер будет заблокирован, если при очередной загрузке не совпадёт контрольная сумма хотя бы одного из файлов .
  • Смарт-карты

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

    • микропроцессор,
    • операционную систему, контролирующую устройство и доступ к объектам в его памяти.

    Смарт-карты применяют в различных областях, начиная от систем накопительных скидок до кредитных и дебетовых карт, телефонов стандарта GSM и др. Назначение смарт-карт - одно и двухфакторная аутентификация пользователей, хранение ключевой информации и проведение криптографических операций в доверенной среде.

    Виды смарт-карт

    Смарт-карты можно разделить по способу обмена со считывающим устройством на:

    • контактные смарт-карты с интерфейсом ISO 7816,
    • контактные смарт-карты с USB-интерфейсом,
    • бесконтактные (RFID) смарт-карты.

    Существуют карты, которые включают в себя как контактные, так и бесконтактные интерфейсы.

    Смарт-карты можно разделит по функциональности на: карты памяти (содержат некоторое количество данных и механизм разграничения доступа к ним), интеллектуальные карты (содержат микропроцессор и возможность управлять данными на карте).

    Контактные смарт-карты с интерфейсом ISO 7816

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

    Контактные смарт-карты с USB-интерфейсом

    Обычно представляют собой микросхему обычной ISO 7816 карты, совмещенную с USB-считывателем в одном миниатюрном корпусе. Такой вид очень удобен для компьютерной аутентификации.

    Бесконтактные смарт-карты

    В бесконтактных смарт-картах общение со считывателем происходит с помощью технологии RFID - требуется подносить карточки достаточно близко к считывателю. Они часто применяются в областях, где необходимо провести операцию быстро - например, в общественном транспорте. Стандарт для бесконтактных смарт-карт - ISO/IEC 14443, реже ISO/IEC 15693. Как и контактные смарт-карты, бесконтактные не имеют батареек. В них встроена катушка индуктивности, чтобы запасти энергию для начального радиочастотного импульса, который затем выпрямляется и используется для работы карточки. Примеры широко используемых бесконтактных смарт-карт - это проездные в метрополитене и наземном транспорте, электронные («биометрические») паспорта, некоторые виды карт в системах контроля доступа (СКУД).

    Карты памяти

    Содержат некоторое количество данных и фиксированный механизм разграничения доступа к ним. Как правило, это карты для микроплатежей на транспорте, в парках отдыха, карты лояльности клиентов и др. В качестве механизма ограничения доступа могут выступать как очень простые (однократная запись, пароль, уникальный номер), так и посложнее (взаимная аутентификация с использованием стандартных симметричных криптоалгоритмов AES, DES). Это наиболее распространённый вид смарт-карт.

    Интеллектуальные карты

    Содержат микропроцессор и возможность загружать алгоритмы его работы. Возможные действия таких карт включают в себя комплексные действия при аутентификации, сложные протоколы обмена, регистрация фактов доступа и др. Помимо симметричной криптографии (AES, DES), знают асимметричную (RSA), алгоритмы инфраструктуры открытых ключей (PKI), имеют аппаратные генераторы случайных чисел, усиленную защиту от физической атаки. Как правило, функционируют под управлением операционной системы (например, JCOP или MULTOS) и снабжены соответствующим пакетом сертификатов. Примеры - электронные («биометрические») паспорта и визы, SIM-карты .

    Токены

    Токен (также аппаратный токен, USB-ключ, криптографический токен) - компактное устройство, предназначенное для обеспечения информационной безопасности пользователя, также используется для идентификации его владельца, безопасного удаленного доступа к информационным ресурсам и др. Как правило, это физическое устройство, используемое для упрощения аутентификации.
    Токены предназначены для электронного удостоверения личности, при этом они могут использоваться как вместо, так и вместе с паролем. Как правило, аппаратные токены небольшого размера и легко умещаются в кармане в виде брелка. Некоторые предназначены для хранения криптографических ключей, таких как электронная подпись или биометрические данные (например, детали дактилоскопического узора). В одни встроена защита от взлома, в другие - мини-клавиатура для ввода PIN-кода или же просто кнопка вызова процедуры генерации и дисплей для вывода сгенерированного ключа. Токены обладают разъёмом USB, функциями RFID или беспроводным интерфейсом Bluetooth для передачи сгенерированной последовательности ключей на клиентскую систему.

    Типы паролей

    Все токены содержат некоторые секретные сведения, которые используются для подтверждения личности. Есть несколько способов использования этой информации:

    • Токен со статическим паролем. Устройство содержит пароль, который физически скрыт (не виден обладателю), но который передается для каждой аутентификации. Этот тип уязвим для атак повторного воспроизведения.
    • Токен с синхронно динамическим паролем. Устройство генерирует новый уникальный пароль с определенным интервалом времени. Токен и сервер должны быть синхронизированы, чтобы пароль был успешно принят.
    • Токен с асинхронным паролем. Одноразовый пароль генерируется без использования часов, с помощью шифра Вернама или другого криптографического алгоритма.
    • Токен вызов-ответ. Используя криптографию с открытым ключом, можно доказать владение частным ключом, не раскрывая его. Сервер аутентификации шифрует вызов (обычно случайное число или по крайней мере, данные с некоторыми случайными частями) с помощью открытого ключа. Устройство доказывает, что обладает копией соответствующего частного ключа, путем предоставления расшифрованного вызова.
    • Одноразовые пароли, синхронизированные по времени. Синхронизированные по времени одноразовые пароли постоянно меняются в установленное время, например, раз в минуту. Для этого должна существовать синхронизация между токеном клиента и сервером аутентификации. Для устройств, не подключенных к сети, эта синхронизация сделана до того, как клиент приобрел токен. Другие типы токенов синхронизируются, когда токен вставляется в устройство ввода.
    • Одноразовые пароли на основе математического алгоритма. Другой тип одноразовых паролей использует сложный математический алгоритм, например, хэш-цепи, для создания серии одноразовых паролей из секретного ключа. Ни один из паролей нельзя отгадать, даже тогда, когда предыдущие пароли известны. Существует общедоступный, стандартизированный алгоритм OATH; другие алгоритмы покрыты американскими патентами. Каждый новый пароль должен быть уникальным, поэтому неавторизованный пользователь не сможет догадаться, что новый пароль может быть, на основе ранее использованных паролей.

    Типы токенов

    Токены без подключения

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

    Токены с подключением

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

    Токены с использованием технологии смарт-карт

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

    Беспроводные токены

    В отличии от токенов с подключением, беспроводные токены формируют логическую связь с компьютером клиента и не требуют физического подключения. Отсутствие необходимости физического контакта делает их более удобными, чем токены с подключением и токены без подключения. В результате данный тип токенов является популярным выбором для систем входа без ключа и электронных платежей, таких как Mobil Speedpass, которые используют RFID, для передачи информации об аутентификации от токена брелока. Тем не менее существуют различные проблемы безопасности, после исследований в Университете имени Джона Хопкинса, и Лаборатории RSA обнаружили, что RFID метки могут быть легко взломаны. Еще одной проблемой является то, что беспроводные токены имеют относительно короткий срок службы (3-5 лет), в то время как USB-токены могут работать до 10 лет.

    Bluetooth-токены

    Bluetooth-токены часто включают в себя USB-штекер, т.е. при отсутствии возможности bluetooth-подключения можно использовать USB-вход. Bluetooth-аутентификация работает на расстоянии около 10 метров .

    Генераторы псевдослучайных двоичных последовательностей

    Для решения проблемы генерирования непредсказуемых двоичных последовательностей большой длины с применением короткого случайного ключа широко используются соответствующие генераторы. Они используются в большинстве алгоритмов шифрования, в особенности потоковых.
    Генератор ключевой последовательности выдает поток битов, который выглядит случайными, но в действительности является детерминированным и может быть в точности воспроизведен на стороне получателя. Чем больше генерируемый поток похож на случайный, тем больше времени потребуется криптоаналитику для взлома шифра. Однако, если каждый раз при включении генератор будет выдавать одну и ту же последовательность, то взломать криптосистему будет просто. Например, в случае использования потокового шифрования, перехватив два шифрованных текста, злоумышленник может сложить их по модулю 2 и получить два исходных текста, сложенных также по модулю 2.
    Все генераторы случайных последовательностей имеют зависимость от ключа.

    Структура генератора

    Структуру генератора ключевой последовательности можно представить в виде конечного автомата с памятью, состоящего из трех блоков:

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

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

    Методы получения псевдослучайных последовательностей

    Линейный конгруэнтный генератор (ЛКГ) – это последовательность чисел от 0 до m −1, удовлетворяющая следующему рекуррентному выражению , X0 - начальное значение, a – множитель, b – приращение, m – модуль. У такого генератора период меньше m . Если a , b , m правильно выбраны, то генератор является генератором максимальной длины и имеет период m (например gcd(m, b) = 1). Основным преимуществом линейных конгруэнтных генераторов является их быстрота, за счет малого количества операций на байт и простота реализации. К сожалению, такие генераторы в криптографии используются достаточно редко, поскольку являются предсказуемыми. К сожалению, ЛКГ не может быть использованы для построения поточных шифров – они предсказуемы, впервые были взломаны Joan Boyar. Она также взломала квадратичные генераторы. Нелинейные конгруэнтные генераторы Иногда используют квадратичные и кубические конгруэнтные генераторы, которые обладают большей стойкостью к взлому. Квадратичный конгруэнтный генератор имеет вид . Аналогично задается кубический генератор. Для увеличения размера периода повторения конгруэнтных генераторов часто используют их объединение (суперпозицию) посредством нелинейного преобразования (функции). При этом криптографическая безопасность не уменьшается, но такие генераторы обладают лучшими характеристиками в некоторых статистических тестах. Линейный регистр с обратной связью (LFSR) состоит из двух частей: регистра сдвига и последовательностью ответвления (tap sequence). Регистр сдвига есть последовательность битов. Как только нам нужен следующий бит, все биты регистра сдвига сдвигаются направо и LFSR выдает наиболее значимый бит. При этом наименьший значимый бит определяется посредством вычисления XOR от прочих битов регистра, согласно последовательности ответвления. Теоретически, n -битный LFSR может сгенерировать псевдослучайную последовательность длиной 2n −1 бит перед зацикливанием. Для этого регистр сдвига должен побывать во всех 2n −1 внутренних состояниях (количество состояний именно 2n −1 , а не 2n , т.к. регистр сдвига, состоящий из нулей, вызовет бесконечную последовательность нулей, что не особо удобно). Только некоторые tap sequences проходят через все 2n −1 состояний, LFSR с такими tap sequences называются LFSR максимальной длины.

    Использование физических датчиков случайных процессов

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

    Биологический датчик

    Случайным элементом являются моменты времени, зафиксированные в моменты использования устройств ввода. Занимает много времени.

    Датчик шума

    Случайным элементом являются последовательности импульсов электронных приборов, шума радиофона и др .

    Криптографические сопроцессоры

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

    Шифрование с секретным ключом

    Шифрование с закрытым ключом основано на том, что доступ к ключу имеет только авторизованный персонал.
    Этот ключ должен держаться в секрете. Если конфиденциальность не соблюдается, посторонний сможет получить несанкционированный доступ к зашифрованной информации.
    Наиболее широко используемым алгоритмом с закрытым ключом является стандарт Data Encryption Standard (DES). Этот алгоритм, разработанный компанией IBM в семидесятых годах прошлого века, принят в качестве американского стандарта для коммерческих и несекретных правительственных коммуникаций. Современные скорости вычислений на порядок превышают скорости вычислений в семидесятых годах, поэтому алгоритм DES считается устаревшим как минимум с 1998 года. Другие известные системы шифрования с закрытым ключом - это RC2, RC4, RC5, тройной DES (triple DES) и IDEA. Тройной DES-алгоритм обеспечивает достаточную степень защиты. Этот алгоритм использует тот же метод шифрования, что и DES, но применяет его трижды, используя при этом до трех разных ключей. Открытый текст шифруется с использованием первого ключа, дешифруется при помощи второго ключа, а затем шифруется с применением третьего ключа.
    Явный недостаток алгоритмов с закрытым ключом состоит в том, что для отправки кому-то защищенного сообщения необходимо располагать безопасным способом передачи этому лицу закрытого ключа.

    Шифрование с открытым ключом

    Шифрование с открытым ключом базируется на двух различных ключах - открытом и закрытом. Открытый ключ используется для шифрования сообщений, закрытый - для их дешифрования. Преимущество этого подхода состоит в том, что, как следует из его названия, открытый ключ можно свободно распространять. Любой человек, которому вы передали свой открытый ключ, может отправить вам защищенное сообщение. Но поскольку закрытым ключом обладаете только вы, только вы и сможете дешифровать сообщение.
    Наиболее известный алгоритм с открытым ключом - это алгоритм RSA, который был разработан Ривестом, Шамиром и Адельманом в Мичиганском технологическом институте (MIT) и опубликован в 1978 году.
    Часто можно встретить гибридные системы. В таких системах алгоритм с открытым ключом применяется для передачи закрытого ключа, который используется для обмена данными до конца связи. Эта дополнительная сложность компенсируется тем, что алгоритмы с закрытым ключом работают на три порядка быстрее алгоритмов с открытым ключом.
    Многими компаниями выпущены криптографические сопроцессоры, позволяющие шифровать данные для их безопасной передачи и потом расшифровывать их. Зачастую они представляют собой карты расширения, вставляемые в PCI-разъем. Благодаря специальному аппаратному обеспечению, эти процессоры могут выполнять необходимые криптографические вычисления намного быстрее, чем центральный процессор .

    Заключение

    Основные выводы:

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

    Просмотров