Файл: Теоретические основы разработки клиент серверных приложений на языке Java.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 16.05.2023

Просмотров: 1105

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

К асимметричным алгоритмам относятся:

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

• ECC (Elliptic curve cryptography) – использует алгебраическую систему, которая описывается в терминах точек эллиптических

кривых, для реализации асимметричного алгоритма шифрования.

• Схема Эль-Гамаля (Elgamal) – вариант Диффи-Хеллмана, который может быть использован как для шифрования, так и для электронной подписи.

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

Сертификат электронной подписи – документ, который подтверждает принадлежность открытого ключа (ключа проверки) ЭП владельцу сертификата. Выдаются сертификаты удостоверяющими центрами (УЦ) или их доверенными представителями.

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

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

Согласно Федеральному закону №63-ФЗ «Об электронной подписи», имеет место деление на[23]:

• простую электронную подпись;

• усиленную неквалифицированную электронную подпись;

• усиленную квалифицированную электронную подпись.

Простая электронная подпись посредством использования кодов, паролей или иных средств подтверждает факт формирования ЭП определенным лицом.

К алгоритмам (схемам) использованием открытого ключа для создания электронной подписи относятся:

• DSA (Digital Signature Algorithm) – основан на вычислительной сложности взятия логарифмов в конечных полях.

• GHR (аббревиатура от фамилий Gennaro, Halevi и Rabin) – схема цифровой подписи с открытым ключом.

• Схема Шнорра (schnorr scheme) – безопасность алгоритма основывается на трудности вычисления дискретных логарифмов.

Уровень защиты всей системы определяется степенью защиты ее самого уязвимого звена, которым, как правило, являются включенные в сеть персональные (клиентские) компьютеры [18].


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

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

1.2 Особенности разработки приложений на языке Java

В Java есть несколько способов взаимодействовать с сетью.

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

(со стороны клиента явно, со стороны сервера – в ответ на запрос соединения со стороны клиента). С каждым сокетом связаны два потока (InputStream и OutputStream): один служит для отправки сообщений, другой – для их приема. При этом все операции с данными потоками являются блокирующими, т.е. исполнение команд прерывается на время выполнения данных операций. Предположим, нам необходимо разработать индексатор сайтов (Web Crowler), являющийся частью поискового робота. Обращение к одному сайту занимает 300 мс. Если нужно проиндексировать 1000 сайтов, то в блокирующем режиме это займет 300 x 1000 мс, т.е. 300 секунд.

Путем ускорения работы приложений при использовании IO является многопоточность – задача делится на части, каждая из которых выполняется своим потоком управления. Например, чтобы обойти 1000 сайтов можно разбить их на четыре группы по 250 сайтов и обойти сайты из каждой группы параллельно. Самой популярной моделью взаимодействия является создание отдельного потока на каждое подключение. Таким образом все соединения обслуживаются параллельно и не мешают друг-другу. Недостатком такого подхода является линейный рост числа потоков и объема требуемой памяти при увеличении числа обслуживаемых соединений. Если потоков будет создано очень много (десятки тысяч), то операционная система сервера будет занята переключением контекстов потоков, а на полезную работу времени может не остаться.


Для решения проблем с блокирующим вводом-выводом был придуман механизм, основанный на мультиплексировании каналов. Данный механизм появился в Java 1.4.2 и был назван New IO (NIO). Суть механизма в следующем: существует мультиплексор (в терминах Java называемый селектором, java.nio.channels.Selector), который в одном потоке, последовательно, производит опрос каналов (в случае сетевого взаимодействия реализуемых классами java.nio.channels.SocketChannel и java.nio.channels.ServerSocketChannel). В результате каждого опроса селектор

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

«ключами» (java.nio.channels.SelectionKey). Каждый ключ содержит информацию о том, к выполнению какой операции готов канал. Задача приложения – в цикле обойти все ключи и выполнить соответствующие операции.

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

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

Если разработчику необходимо управлять тысячами открытых соединений одновременно, причем каждое из них передает лишь незначительный объем данных, выбор Java NIO может дать преимущество.

Рисунок 5. структура NIO

Если приложение имеете меньшее количество соединений, по которым передаются большие объемы данных, то лучшим выбором станет классический дизайн системы ввода/вывода:


Рисунок 6. Структура IO

Важно понимать, что Java NIO отнюдь не является заменой Java IO. Его стоит рассматривать как усовершенствование – инструмент, позволяющий

значительно расширить возможности по организации ввода/вывода. Грамотное использование мощи обоих подходов позволит вам строить хорошие высокопроизводительные системы.

Язык Java определяет ряд API, охватывающих главные области безопасности:

• Криптографические операции (шифрование, цифровые подписи, обзоры сообщения, и т.д.);

• Генераторы или преобразователи криптографического материала (ключи и параметры алгоритма);

• Объекты (keystores или сертификаты), которые инкапсулируют криптографические данные и могут использоваться в более высоких уровнях абстракции.

JCA (Java Cryptography Architecture) предоставляет API который позволяют разработчикам легко интегрировать механизмы безопасности в свой код программы. JCA в пределах JDK (Java Development Kit) включает два компонента программного обеспечения:

1. Платформа, которая определяет и поддерживает криптографические службы, для который провайдеры предоставляют реализации. Эта платформа включает пакеты такой как java.security, javax.crypto, javax.crypto.spec, и javax.crypto.interfaces.

2. Фактические провайдеры такой как Sun, SunRsaSign, SunJCE, которые содержат фактические криптографические реализации.

Другие криптографические коммуникационные библиотеки, доступные в JDK, используют архитектуру провайдера JCA, но описываются в другом месте. Расширение Защищенного сокета Java™ (JSSE) обеспечивает доступ к Уровню защищенных сокетов (SSL) и Безопасность Транспортного уровня (TLS) реализации. Java Универсальные Службы безопасности (JGSS) (через Kerberos) API, и Простой Уровень Аутентификации и Безопасности (SASL)

может также использоваться для того, чтобы надежно обмениваться сообщениями между связывающимися приложениями [14].

JCA был разработан вокруг этих принципов:

• Независимость реализации и функциональная совместимость;

• Независимость алгоритма и расширяемость.

Независимость алгоритма достигается, определяя универсальный высокоуровневый прикладной программный интерфейс (API) что все использование приложений, чтобы получить доступ к типу службы. Независимость реализации достигается при наличии всех реализаций провайдера, соответствуют четко определенным интерфейсам[14].

API JCA содержит следующие классы:

• SecureRandom: используемый, чтобы генерировать случайные или псевдослучайные числа.


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

• Signature: initilialized с ключами, они используются, чтобы подписать данные и проверить цифровые подписи.

• Cipher: инициализированный с ключами, они используемые для того, чтобы шифровать/дешифровать данные. Есть различные типы алгоритмов: симметричное шифрование больших объемов данных (например, AES, DES, DESede, Blowfish, IDEA), поточное шифрование (например. RC4), асимметричное шифрование (например. RSA), и основанное на пароле шифрование (PBE).

• Message Authentication Codes (MAC): как MessageDigests, они также генерируют значения хэш-функции, но сначала инициализируются с ключами, чтобы защитить целостность сообщений.

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

• SecretKeyFactory: используемый, чтобы преобразовать существующие непрозрачные криптографические ключи типа SecretKey в ключевые спецификации (прозрачные представления базового ключевого материала), и наоборот. SecretKeyFactorys специализируются KeyFactorys, которые создают секретные (симметричные) ключи только.

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

• KeyGenerator: используемый, чтобы генерировать новые секретные ключи для использования с указанным алгоритмом.

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

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

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

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

аутентифицирует соответствующий открытый ключ. keystore также содержит сертификаты от доверяемых объектов.

• CertificateFactory: используемый, чтобы создать сертификаты с открытым ключом и Списки аннулированных сертификатов (CRL).

• CertPathBuilder: используемый, чтобы создать цепочки сертификата (также известный как пути сертификации).

• CertPathValidator: используемый, чтобы проверить цепочек сертификата.

• CertStore: используемый, чтобы получить Certificates и CRLs от репозитария.