Типовую безопасность в java обеспечивает механизм. Безопасность и виртуальная Java-машина

Что такое информационная безопасность? Это состояние защищенности информации, при котором обеспечиваются её конфиденциальность, доступность и целостность.

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

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

Как обеспечить безопасность в Java

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

« Универсальный язык» звучит красиво, но самая распространённая проблема - это одновременно и обратная сторона медали - утечка памяти в JVM, что приводит к переполнению памяти и сбоям. В связи с этой проблемой не исключены уязвимости, ведь основной постулат надежности - чем проще, тем лучше. В данном же случае собирается такой сложный пирог из обеспечения совместимости большого количества платформ и ОС, что практически невозможно отслеживать и закрывать все найденные в них уязвимости и оперативно их устранять. У той же Microsoft уязвимости могут быть найдены и исправлены спустя 4-8 лет, и это если не брать в расчёт оставленные намеренно или по ошибке недекларированные возможности.

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

На текущий момент выпущен Java Development Kit 10, который предлагает нам штатные механизмы обеспечения безопасности, выпущенные еще для Java SE 8 и описанные в Security Documentation. В десятой версии не добавилось ничего нового.

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

А) разработчики должны:

Следить и использовать все последние обновления среды разработки и безопасности;

Использовать программы контроля корректности кода (например, Checker Framework);

Б) системные администраторы должны:

Следить и использовать все последние обновления для Java и необходимые компоненты для работы продукта (в т. ч. ОС, библиотеки, фреймворки, и т. д.);

Использовать правила развертывания Java, описанные и ;

Использовать надёжную метку времени.

В) конечные пользователи должны:

Всегда использовать последнюю оригинальную версию Java;

Г) профессионалам в области безопасности необходимо:

Использовать расширенные инструменты управления и повышения безопасности (например, Advanced Management Console);

Контролировать своевременную установку всех обновлений безопасности;

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

Разработка ПО и вопросы безопасности

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

А) Отсутствие понимания терминологии безопасности в целом, не говоря о специфических знаниях и применяемых решениях.

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

Для паролей: обычно используются значения по умолчанию и не настраиваются дополнительно длина, стойкость, частота смены, неповторяемость, количество попыток. Довольно часто эти параметры нельзя донастроить, так как они не были включены в скоуп-задачу по разработке ПО, что приводит к необходимости дописывать код.

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

Защита каналов связи - не менее существенный момент, особенно для платежных и банковских систем, где помимо разглашения персональных и личных данных возможны финансовые потери. Чаще всего бывает, что о защите каналов и среды передачи информации не думают, а если и думают, то используют настройки «по умолчанию», например, TLS/SSL. Но там ведь тоже есть свои особенности по выбору версии протокола (TLS 1.1, 1.2, 1.3 или SSL v1-3), алгоритма шифрования (RC4, IDEA, Triple DES, SEED, Camellia или AES), длины ключа. Иногда выбирается, например, правильный протокол TLS 1.2, с шифрованием по AES, длиной ключа 256 бит, но забывается про возможность выбора адреса по порту 443 для HTTPS и или 80-й порт для HTTP, вместо блокировки 80-го порта, в результате чего появляется возможность получать доступ по незащищенному каналу. Или, например, поднимают инфраструктуру на виртуальных машинах и совсем не думают о необходимости закрыть сетевой доступ между виртуальными машинами.

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

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

К сожалению, в этом виноват не только бизнес, но и его окружение, которое:

Также не понимает в безопасности;

Пожалело бюджет на специалистов по ИБ (не нанимаются вообще или нанимаются узкоспециализированные специалисты, или нанимается один человек, отвечающий за все);

Не смогло аргументировано донести необходимость в безопасности и правильно обосновать текущие риски (репутационные, финансовые, временны́е).

В) Проблема с коммуникацией в компании или отсутствие оной.

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

Г) Недостаточная осведомленность простых пользователей компании в вопросах ИБ.

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

Д) Нехватка архитекторов ИБ - не всегда в разработке ПО участвуют специалисты по ИБ, и программисты сами думают о безопасности архитектуры и применении написанных и готовых шаблонов безопасности (Security patterns).

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

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

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

В данном разделе анализируется концепция безопасности в общем контексте взаимодействия в сети Web и реализация защиты посредством исполняемого кода.

Сначала рассмотрим двойственность вопроса безопасности в отношении сети Web и эволюцию сети Web как среды в контексте этой двойственности. Затем можно начинать описание проблемы защиты в контексте исполняемого кода.

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

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

1. Предугадать любые потенциально опасные действия и методы вторжения.

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

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

4. Доказать логически или, если возможно, показать как очевидное тот факт, что язык и среда действительно защищены против методов преднамеренного вторжения.

5. Реализовать язык и разрешить исполняемым программам пользоваться только этим утвержденным безопасным языком.

Сценарии внешней атаки можно разбить на следующие группы (список не полный):

· Повреждение или нарушение целостности данных и/или состояния выполняемой программы;

· Сбор или копирование конфиденциальной информации;

· Блокирование ресурсов, вследствие которого они становятся недоступными для законных пользователей и программ;

· Захват ресурсов и их использование внешней неавторизованной программой;

· Создание нефатальных ситуаций, снижающих производительность, особенно в устройствах вывода;

· Присвоение прав доступа и использование их или компьютера клиента для вторжения в другие элементы сети.

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

Таблица1.1 Потенциально уязвимые объекты и типы воздействие

Нарушение целостности

Перехват информации

Блокировка/ Изменение прав

Захват ресурса

Нефатальные помехи

Захват полномочий

Файловая система

Нарушение целостности

Перехват информации

Блокировка/ Изменение прав

Захват ресурса

Нефатальные помехи

Захват полномочий

Конфиденциальная информация

Центральный

процессор

Устройства вывода

Устройства ввода

ОС, состояние программ

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

Говоря конкретно, схема защиты языка Java рассматривает следующие уязвимые объекты:

· Память;

· ОС/состояние программ;

· Файловая система клиента;

· При этом учитываются следующие типы вмешательств, перечисленные в табл. 1.1;

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

· Блокировка/изменение прав пользования ресурсами клиентской машины. Обычно вызывается вирусами;

· Перехват информации в клиентской машине. К примеру, легко выполняется при помощи команды UNIX SENDMAIL;

· Захват полномочий клиентской машины. Достигается подменой IP- адресов. Этот тип компьютерной атаки был придуман Кевином Митни- ком (Kevin Mitnick), когда тот "взломал" один из личных компьютеров эксперта по системам защиты Сутумо Шимура (Tsutumo Shimura). Весь этот инцидент подробно описан в бестселлере "Разборки", написанной для "New York Times" Сутумо Шимурой.

Первый уровень безопасности в Java -- это архитектура самого языка, синтаксические и семантические конструкции языка. Далее структура языка Java рассматривается с точки зрения безопасности.

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

· Инкапсуляция и сокрытие данных в private-объявлениях;

· Управляемый доступ к структурам данных, при котором; используются только public-методы;

· Наращиваемость и иерархическое построение сложной структуры программы;

· Отсутствие перегрузки операций.

Классы и методы можно объявлять как final, запрещая тем самым создание подклассов и переопределение методов. Такое объявление препятствует злонамеренному изменению проверенного кода.

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

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

Java является многопотоковым языком и обеспечивает защищенный потоковый доступ к структурам данных и объектам. В главе 14 потоки Java рассматриваются подробно, приводятся примеры прикладных программ.

С каждым объектом в языке Java связан уникальный хэш-код (hashcode). Это означает, что в любой момент возможен мониторинг состояния Java- программы.

Во время компиляции анализируются все механизмы защиты, существующие в синтаксисе языка Java, включая проверку согласованности объявлений private и public, правильности типов и инициализации всех переменных в соответствии с предопределенными значениями.

Исходные классы Java компилируются в байт-коды. Верификатор байт- кодов выполняет множество проверок согласованности и безопасности компилированного кода. При верификации байт-кодов выполняются следующие операции:

· Проверка переполнения стека и потери значимости указателя стека;

· Анализ доступа к регистрам;

· Проверка правильности параметров байт-кодов;

· Анализ потоков байт-кодов, создаваемых методами, что обеспечивает целостность стека проверка получаемых объектов и объектов, возвращаемых методами.

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

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

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

Любые другие способы загрузки классов, включая передачу по сети, требуют наличия соответствующего класса ClassLoader. ClassLoader -- это подкласс стандартного класса Java ClassLoader, имеющего методы, которые реализуют все механизмы проверки согласованности и защиты и запускаются для каждого вновь загружаемого класса.

Из соображений безопасности класс ClassLoader не может выполнять никаких опережающих действий в отношении байт-кодов. Байт-коды могут быть получены из Java-программы, транслируемой Java-компилятором или компилятором С++, модифицированным для создания байт-кодов. Это означает, что ClassLoader запускается только после проверки поступившего байт-кода; этот класс отвечает за создание пространства имен для загруженного кода и разрешение ссылок на имена классов, адресованных в полученном коде. При этом для каждого пакета создаются отдельные пространства имен.

В языках С и С++ программист явным образом распределяет память, освобождает ее и следит за всеми указателями на выделенную память. Зачастую это усложняет сопровождение программ и является главным источником ошибок, приводящих к появлению "висячих ссылок", вызванных использованием null-указателей и неправильными операциями выделения и освобождения памяти.

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

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

Помимо других особенностей в классе SecurityManager имеются методы для распознавания процессов проверки безопасности, а также методы для выполнения следующих проверок:

· Защита от инсталляции дополнительного загрузчиков классов ClassLoader;

· Возможность компоновки динамических библиотек (используется для машинно-зависимого кода);

· Чтение из файла классов а Запись в файл классов;

· Создание сетевого соединения;

· Возможность соединения с некоторым сетевым портом;

· Разрешение входящего сетевого соединения;

· Доступность некоторого пакета;

· Добавление в пакет нового класса.

Главным источником опасности для Java-nporpaMM является Java-код, поступающий из сети и выполняющийся на клиентском компьютере. Подобные транспортируемые Java-nporpaMMbi называются апплетами. Java-апплет имеет четко определенный набор возможностей и ограничений на уровне языка, особенно в части механизмов защиты.

На апплеты, загружаемые по сети, накладываются следующие ограничения:

· Нельзя создавать, переименовывать или копировать файлы и каталоги локальной файловой системы;

· Нельзя создавать произвольные сетевые соединения, за исключением связей с той хост-машиной, с которой апплеты были считаны. Имя хост- машины должно быть указано в URL-адресе той HTML-страницы, которая содержала тег , или задаваться в параметре codebase тега . Числовой IP-адрес хост-машины не допускается.

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

Апплеты могут считывать некоторые свойства системы при помощи вызова system.getProperty (string key). Апплеты в Netscape 3.0 имеют неограниченный доступ к этим свойствам. В программе JDK 1.0 Appletviewer от Sun можно индивидуально контролировать доступ к каждому свойству. В табл. 1.2 перечислена информация, возвращаемая для различных значений ключа key.

java интерфейс приложение программа

Таблица 1.2 Доступность системных переменных

В табл. 1.3 перечислены параметры, недоступные для апплетов в среде браузера Netscape 3.0. Программа JDK 1.0 Appletviewer и браузер HotJava позволяют пользователю управлять доступом к некоторым из указанных ресурсов.

Таблица 1.3 Системные переменные, недоступные для апплетов

Java-система загружает апплеты двумя способами. Апплет может быть передан по сети или же загружен из локальной файловой системы. Способ загрузки апплета определяет предоставляемые ему возможности.

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

· Загружать в клиентской машине библиотеки;

· Выполнять в локальной машине внешние процессы;

· Останавливать работу виртуальной Java-машины.

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Нижегородский государственный технический университет

Институт радиоэлектроники и информационных технологий

Кафедра «Информатика и системы управления»

Методы и средства защиты компьютерной информации

«Система безопасности Java»

Нижний Новгород, 2007

1. Принцип работы Java

2. Защита Java-аплетов

3. Модель безопасности JDK1.2

4. Криптографическая архитектура Java

5. Объектная организация механизмов безопасности

Список используемой литературы

1. Принцип работы Java

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

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

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

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

2. Защита Java -аплетов

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

· проверять существование и параметры определенного файла;

· осуществлять доступ по сети к удаленному компьютеру;

· получать список сетевых сеансов связи, которые устанавливает локальный компьютер с другими компьютерами;

· получать сведения о пользователе или его домашней директории;

· выходить из интерпретатора Java;

Эти правила обеспечивают следующие компоненты Java-технологии.

· Собственно виртуальный Java-процессор, который постоянно контролирует свое состояние.

· Загрузчик аплетов и Java-программ, который контролирует загружаемые коды.

· Диспетчер безопасности (Secu-rityManager), контролирующий и блокирующий опасные действия аплетов.

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

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

· соответствует ли версия полученного блока версиям остальных элементов системы;

· соответствует ли программа спецификации конкретного виртуального Java-процессора;

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

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

Блокировка сервиса

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

· заполнение всей свободной памяти;

· захват важных системных классов.

"Тайные" каналы

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

· посылку почты через SMTP-порт сервера (причем почта посылается от имени пользователя, который работает с аплетом);

· запрос на поиск по несуществующему URL-адресу, в котором в качестве параметров передаются необходимые "взломщику" данные;

· попытку доступа по несуществующему адресу (последовательность директорий может содержать необходимые данные).

Информация, известная аплетам

С помощью этой информации можно получить некоторые сведения, которые впоследствии могут быть им использованы для "взлома". Эту информацию можно передавать даже через брандмауэры по тайным каналам, которые описаны выше. Аплетам обычно известна следующая системная информация:

· системное время;

· название и версия операционной системы;

· архитектура процессора.

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

3. Модель безопасности JDK 1.2

В Java-технологии предусмотрен целый ряд защитных рубежей, которые можно разделить на три группы:

· надежность языка;

· контроль при получении и загрузке программ;

· контроль при выполнении программ.

Java обеспечивает безопасность за счет средств статического и динамического контроля. Еще одно Java -- автоматическое управление памятью, исключающее появление "висячих" указателей.

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

· подделка указателей (например, получение указателя как результат выполнения арифметической операции);

· нарушение прав доступа к компонентам классов;

· вызов методов объектов с недопустимым набором параметров;

· недопустимое преобразование типов;

· переполнение или исчерпание стека.

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

Если продолжить деление на группы и уровни, то полезно выделить следующие два аспекта Java-безопасности:

· защита Java-окружения времени выполнения и ресурсов аппаратно-программной платформы от вредоносного программного обеспечения;

· разграничение доступа субъектов к ресурсам прикладного уровня.

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

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

Чтобы как-то справиться с этой проблемой, ввели понятие электронной подписи, которую ставит распространитель аплета. Java-машина в соответствии со своей политикой безопасности делит распространителей и, соответственно, их аплеты на две категории -- надежные и ненадежные. Надежные аплеты были приравнены в правах к "родному" коду.

Оформились три основных понятия:

· источник программы;

· право и множество прав;

· политика безопасности.

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

Право -- это абстрактное понятие, за которым, как обычно в Java, стоят классы и объекты. В большинстве случаев право определяется двумя цепочками символов -- именем ресурса и действием. Например, в качестве ресурса может выступать файл, а в качестве действия -- чтение.

Политика безопасности задает соответствие между источником и правами поступивших из него программ. "Родные" программы не имеют каких-либо привилегий в плане безопасности и политика по отношению к ним может быть любой.

По сути имеется традиционный для современных операционных систем и систем управления базами данных механизм прав доступа со следующими особенностями:

· Субъектом доступа является не пользователь, а источник программы. Впрочем, формально можно считать, что во время исполнения программы ее источник становится;

· Нет понятия владельца ресурса, который (владелец) мог бы менять права; последние задаются исключительно политикой безопасности.

Модель безопасности в JDK 1.2

4. Криптографическая архитектура Java

Без криптографии невозможны надежная аутентификация, контроль целостности и сохранение конфиденциальности.

Криптографическая архитектура Java (Java Cryptography Architecture, JCA) разработана для предоставления следующих сервисов:

· постановка/проверка электронной подписи;

· вычисление хэш-функции;

· генерация пар ключей открытый/секретный;

· создание сертификатов, подтверждающих аутентичность открытых ключей;

· хранение ключей, а также сертификатов надежных партнеров;

· преобразование ключей из представления со скрытой структурой в общепонятное представление и наоборот;

· генерация параметров криптографических алгоритмов;

· генерация (псевдо)случайных чисел;

· симметричное шифрование;

· выработка общего ключевого материала.

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

· обеспечивать независимость от алгоритмов и их реализаций;

· обеспечивать взаимную совместимость реализаций;

· обеспечивать расширяемость набора алгоритмов и их реализаций.

Каждый сервис может обеспечиваться несколькими алгоритмами, каждый из которых, в свою очередь, может иметь несколько реализаций. Например, для вычисления хэш-функции предназначены алгоритмы MD5/SHA-1 (равно как и российский ГОСТ "Функция хэширования"), для выработки и проверки электронной подписи -- алгоритмы RSA/DSA, российский ГОСТ "Процедуры выработки и проверки электронной цифровой подписи" и т.д.

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

Два последних элемента в списке сервисов (симметричное шифрование и выработка общего ключевого материала) подвержены экспортным ограничениям США, поэтому они, в отличие от остальных перечисленных сервисов, оформлены как расширение (Java Cryptography Extension, JCE), являющееся отдельным продуктом.

Иерархия криптографических сервисов, алгоритмов и реализаций

5. Объектная орга низация механизмов безопасности

java аплет защита криптографический

Механизмы безопасности в JDK 1.2 оформлены в виде четырех основных пакетов и трех пакетов расширения. Вот некоторые из них

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

· java.security.interfaces -- средства генерации RSA- и DSA-ключей.

· javax.crypto -- интерфейс и классы для симметричного шифрования.

Наиболее важные с концептуальной точки зрения интерфейсы и классы сосредоточены в пакете java.security .

Политика безопасности

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

Проверка прав доступа

Для контроля прав доступа можно пользоваться двумя средствами:

· встроенным менеджером безопасности, получившим название AccessController ;

· динамически изменяемым менеджером безопасности -- SecurityManager .

Класс AccessController предоставляет единый метод для проверки заданного права в текущем контексте -- checkPermission.

Криптографические интерфейсы и классы

Объектная организация криптографической подсистемы Java естественным образом отражает описанную выше криптографическую. Каждому сервису соответствует абстрактный класс, описывающий его (сервиса) программный интерфейс, а также класс, описывающий программный интерфейс поставщика сервиса. Важными являются классы Provider и Security . В первом собраны общие методы поставщиков криптографических услуг, во втором -- методы управления поставщиками и параметрами алгоритмов.

Список используемой литературы

1. http://www.jetinfo.ru/1998/11-12/1/article1.11-12.19981237.html

2. http://vestnik.sci.pfu.edu.ru/archiv-cs/articles-cs/2004-3-1/pdf/kulyabov-2004.pdf

3. http://ru.wikipedia.org/wiki/Java

4. http://infocity.kiev.ua/hack/content/hack081.phtml

5. http://citforum.uar.net/security/web/java_seq.shtml

6. http://www.htc-cs.ru/press/tribune/java.html

7. http://www.ccc.ru/magazine/depot/00_11/print.html?web3.htm

Размещено на Allbest.ru

Подобные документы

    Архитектура Java и Java RMI, их основные свойства, базовая система и элементы. Безопасность и виртуальная Java-машина. Интерфейс Java API. Пример использования приложения RMI. Работа с программой "Calculator". Универсальность, портативность платформ.

    курсовая работа , добавлен 03.12.2013

    Понятие и функциональные особенности Java Card как версии Java-платформы для устройств с крайне ограниченными вычислительными ресурсами, оценка ее возможностей и необходимых ресурсов. Анализ степени безопасности платформы, взаимодействие компонентов.

    презентация , добавлен 19.05.2014

    Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.

    курсовая работа , добавлен 10.11.2014

    История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.

    курсовая работа , добавлен 14.12.2012

    Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.

    методичка , добавлен 30.06.2009

    Архитектура уровня команд платформы Java, формат файла класса Java. Компилятор ассемблероподобного языка, позволяющий создавать файлы классов, корректно обрабатываемые реальной JVM, поддерживающий все команды байт-кода Java и важнейшие возможности JVM.

    курсовая работа , добавлен 17.09.2008

    Кратка историческая справка развития языка Java. Анализ предметной области. Java platform, enterprise and standart edition. Апплеты, сервлеты, gui-приложения. Розработка программного кода, консольное приложение. Результаты работы апплета, сервлета.

    курсовая работа , добавлен 23.12.2015

    Преимущество использования программ, написанных на Java, требования к ним и настройки на клиентском ПК. Развертывание и последующее "автоматическое" обновление версий GUI клиента с помощью использования технологии Java Web Start в среде Windows.

    реферат , добавлен 16.05.2011

    Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.

    курсовая работа , добавлен 19.07.2014

    Расширяемый язык разметки XML. Описание типа документа DTD. Значение XML и платформы Java. Обзор стандартных анализаторов DOM и SAX. Технология Java Servlet, Java Server Pages (JSP), JavaBeans. Общая функциональность программного продукта. Модель данных.

Язык программирования Java и сопровождающая его система поддержки исполнения программ были разработаны для того, чтобы однажды разработанные и скомпилированные программы поставлялись через Интернет в двоичном виде и работали на любой машине, поддерживающей Java. Безопасность стала частью разработки Java с самого начала. В данном разделе будет рассмотрена работа этой системы безопасности.

Java является языком, обеспечивающим безопасность при работе с типами. Это означает, что компилятор отклонит любую попытку использовать переменную таким



местим с ее типом. Для сравнения рассмотрим следующий

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

Java-программы компилируются в промежуточный двоичный код, называемый байткодом JVM. В JVM есть около 100 команд, большинство из которых помещают объекты определенного типа в стек, извлекают их из стека или арифметически объединяют две записи в стеке. Эти JVM-программы, как правило, интерпретируются, хотя в некото
рых случаях они могут быть скомпилированы в машинный язык для более быстрого исполнения. В модели Java апплеты, отправляемые через Интернет для удаленного исполнения, являются JVM-программами.

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

1. Не пытается ли апплет подделать указатели?

2. Не нарушает ли он ограничения доступа к элементам закрытых классов?

3. Не пытается ли он использовать переменную одного типа как переменную другого типа?

4. Не генерирует ли он переполнение стека или выход за его нижние границы?

5. Не совершает ли он недопустимые преобразования переменных одного типа в переменные другого типа?

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

Тем не менее апплеты все же могут выполнять системные вызовы за счет вызова Java- методов (процедур), предоставляемых для этих целей. Способы, которые использовались для этого в Java, все время совершенствовались. В первой версии Java, JDK (Java Development Kit - инструментарий Java-разработчика) 1.0, апплеты подразделялись на два класса: надежные и ненадежные. Апплеты, получаемые с локального диска, были надежными и им разрешалось выполнять любой необходимый им системный вызов. В отличие от них апплеты, получаемые через Интернет, считались ненадежными. Они запускались в песочнице, как показано на рис. 9.33, и им практически ничего не разрешалось делать.

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

После приобретения дополнительного опыта эта система также была признана неудовлетворительной, поэтому модель безопасности опять претерпела изменения. В JDK 1.2 была представлена конфигурируемая, тонко настраиваемая политика безопасности, применяемая ко всем апплетам, как локальным, так и удаленным. Эта модель безопасности настолько сложна, что ее описанию следует посвятить отдельную книгу (Gong, 1999), поэтому мы дадим лишь краткую обобщенную картину некоторых ее основных особенностей. Каждый апплет характеризуется двумя вещами: тем, откуда он прибыл и тем, кто его подписал. На вопрос, откуда он прибыл, отвечает его URL, а на вопрос, кто его подписал, отвечает закрытый ключ, который был использован для его цифровой подписи. Каждый пользователь может создать политику безопасности, состоящую из перечня правил. В каждом правиле могут перечисляться URL, владелец подписи, объект и действие, которое апплет может совершить с объектом, если URL апплета

и владелец подписи совпадут с указанными в правиле. Концептуально предоставляемая информация показана в табл. 9.3, хотя реально она отформатирована по-другому и имеет отношение к иерархии классов Java.


Один вид действий разрешает доступ к файлу. Действие может определять конкретный файл или каталог, набор всех файлов в заданном каталоге или набор всех файлов и каталогов, рекурсивно содержащихся в заданном каталоге. Три строки в табл. 9.3 соответствуют этим трем случаям. В первой строке пользователь Сьюзен установила свою запись прав доступа так, что апплеты, поступающие от машины обработчика ее налоговых данных, которая называется www.taxprep.com, и подписанные компанией- обработчиком, имеют доступ для чтения к ее налоговым данным в файле 1040.xls. Они могут читать только этот файл, который не могут читать никакие другие апплеты. Кроме того, все апплеты из всех источников независимо от того, подписаны они или нет, могут читать и записывать файлы в каталоге /usr/tmp.

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

В качестве защищаемых ресурсов могут выступать не только файлы. Можно также защитить доступ к сети. Здесь объектом будет конкретный порт на конкретном компьютере. Компьютер указывается с помощью IP-адреса или DNS-имени; порты на этом компьютере указываются диапазоном чисел. Возможные действия включают в себя подключение к удаленному компьютеру и прием подключений, исходящих от удаленного компьютера. Таким образом, апплет может получить доступ к сети, но этот доступ ограничен обменом данными только с теми компьютерами, которые явным образом перечислены в списке разрешений. Апплеты могут в случае необходимости динамически загружать дополнительный код (классы), но предоставляемые пользователем загрузчики классов могут осуществлять строгий контроль того, какие машины могут быть источниками этих классов. Существует также множество других средств безопасности.

Еще по теме Безопасность в системе Java:

  1. § 39 Классификация договоров в отдельных видах. – Римская классификация. – Система прусского закона, французского и австрийского кодекса. – Система русского свода. – Система настоящего изложения.

Язык Java. Введение.

Долгое время трудно было представить себе компьютерный журнал без статьи, посвященной языку Java. О нем писали даже такие популярные газеты и журналы, как The New York Times, The Washington Post и Business Week.

Невозможно припомнить, чтобы национальное общественное радио (National Public Radio) когда-либо посвящало языку программирования десятиминутную передачу. Хорошо это или плохо, зависит от точки зрения. А инвестиции объемом 100 миллионов долларов, вложенные в производство программного обеспечения, создаваемого с помощью конкретного языка программирования?! Телекомпании CNN, CNBC и другие средства массовой информации только и говорили, да и сейчас говорят, о том, как язык Java и то сможет, и это сделает.

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

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

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

Язык Java как средство программирования

Как язык программирования Java перевыполнил свои рекламные обещания. Несомненно, это один из лучших языков, доступных серьезным программистам. Потенциально Java имеет все предпосылки, чтобы стать великим языком программирования, однако, вероятно, сейчас уже слишком поздно. Когда появляется новый язык программирования, немедленно возникает неприятная проблема его совместимости с программным обеспечением, созданным ранее. Более того, даже если изменения в эти программы можно внести без вмешательства в их текст, создателям языка, который так горячо приветствовался публикой, как, например, язык Java, сложно прямо сказать: "Да, возможно мы ошиблись при разработке версии X, но версия Y будет лучше". В итоге, ожидая появления дальнейших улучшений, мы должны констатировать, что структура языка Java в ближайшем будущем существенно не изменится.

Возникает очевидный вопрос: "Как удалось улучшить язык Java? ". Оказывается, это сделано не за счет усовершенствования собственно языка программирования, а путем коренного изменения библиотек программ, написанных на языке Java. Компания Sun Microsystems изменила все: начиная с имен отдельных библиотечных функций (сделав их более осмысленными) и методов работы графических модулей (изменив способ обработки событий и частично переписав рабочие программы), и заканчивая созданием новых свойств языка, например, средств вывода информации на печать, которых не было в версии Java 1.0. В результате получилась гораздо более полезная программная платформа, чем все предыдущие версии языка Java.

Компания Microsoft выпустила в свет свой собственный продукт под названием J++, имеющий отношение к языку Java. Язык J++ интерпретируется виртуальной машиной, совместимой с виртуальной машиной языка Java (Java Virtual Machine) при выполнении байт-кода, но интерфейсы с внешними кодами у этих языков значительно различаются. Языки J++ и Java имеют практически одинаковый синтаксис. Однако компания Microsoft создала дополнительные языковые конструкции. Все они имеют довольно сомнительную ценность, за исключением интерфейса Windows API. Помимо того, что у этих языков одинаковый синтаксис, их основные библиотеки (строки, утилиты, средства сетевого программирования, средства поддержки многопоточности, математические библиотеки и т.п.), по существу, также совпадают.

Однако графические библиотеки, пользовательский интерфейс и доступ к удаленным объектам у этих языков совершенно разные. В настоящее время компания Microsoft больше не поддерживает язык J++, разработав новый язык С#, имеющий много общего с Java, но использующий другую виртуальную машину. В этой книге ни язык J++, ни язык С# не описываются.

Преимущества языка Java

1) Одно из основных преимуществ языка Java - независимость от платформы, на которой выполняются программы : один и тот же код можно запускать под управлением операционных систем Windows, Solaris, Linux, Machintosh и др.
Это действительно необходимо, когда программы загружаются через Интернет для последующего выполнения под управлением разных операционных систем.

2) Другое преимущество заключается в том, что синтаксис языка Java похож на синтаксис языка C++, и программистам, знающим языки С и C++, его изучение не составляет труда . Правда, для программистов, владеющих языком Visual Basic, этот синтаксис, возможно, будет непривычен.

Если вы никогда не программировали на языке C++, некоторые термины, использованные в этом разделе, будут вам непонятны. В этом случае можете пропустить его. Пока вы доберетесь до конца главы 6, эти термины станут для вас привычными.

3) Кроме того, Java - полностью объектно-ориентированный язык, даже в большей степени, чем C++ . Все сущности в языке Java являются объектами, за исключением немногих основных типов (primitive types), например чисел. (Поскольку с помощью объектно-ориентированного программирования легко разрабатывать сложные проекты, оно заменило собой более древнее структурное программирование. Если вы не знакомы с объектно-ориентированным программированием, главы 3-6 предоставят вам все необходимые сведения о нем.)

Однако разработать еще один, слегка улучшенный, диалект языка C++ недостаточно. Принципиально важно, чторазрабатывать программы, не содержащие ошибок, наязы- ке Java легче, чем наязыке C++. Почему? Разработчики языка Java долго размышляли о том, отчего программы, написанные на языке C++, так подвержены ошибкам. Они снабдили язык Java средствами, позволяющими исключить саму возможность создавать программы, в которых были бы скрыты наиболее распространенные ошибки. Для этого в языке Java сделано следующее.

4) Исключена возможность явного выделения и освобождения памяти.
Память в языке Java освобождается автоматически с помощью механизма сборки мусора. Программист гарантирован от ошибок, связанных с неправильным использованием памяти.

5) Введены истинные массивы и запрещена арифметика указателей.
Теперь программисты в принципе не могут стереть данные из памяти вследствие неправильного использования указателей.

6) Исключена возможность перепутать оператор присваивания с оператором сравнения на равенство.
Теперь нельзя даже скомпилировать выражение if(ntries = 3) . . . (программисты на языке Visual Basic могут вообще не заметить здесь никакой проблемы, поскольку эта ошибка - источник большинства недоразумений в языках С и C++).

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

Характерные особенности языка Java

Простой
Интерпретируемый
Распределенный
Надежный
Безопасный
Машинонезависимый
Объектно-ориентированный
Высокопроизводительный
Многопоточный
Динамичный
Не зависящий от архитектуры компьютера

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

Простой

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

Синтаксис языка Java, по существу, представляет собой очищенный вариант синтаксиса языка C++. В этом языке нет заголовочных файлов, арифметики указателей (и самих указателей), структур, объединений, перегрузки операторов, виртуальных базовых классов и т.п. (Различия между языками Java и C++ описываются в замечаниях о языке C++, разбросанных по всей книге.) Однако разработчики не стремились исправить все недостатки языка C++.

Например, синтаксис оператора switch в языке Java остался неизменным. Зная язык C++, перейти к синтаксису языка Java будет легко.
Если обычно вы используете визуальную среду программирования (например Visual Basic), язык Java покажется вам сложным.
Его синтаксис часто выглядит довольно странным (хотя понять смысл выражения не составляет труда). Важнее то, что при работе на языке Java приходится намного больше программировать. Прелесть языка Visual Basic заключается в том, что его визуальная среда программирования позволяет почти автоматически создавать инфраструктуру приложения. Чтобы достичь того же результата с помощью языка Java, необходимо программировать вручную, но при этом получаются намного более короткие программы.

Существует, однако, и третья разновидность сред программирования, позволяющих создавать программы с помощью технологии "перетащить-и-опустить" ("drag-and-drop").

Другой аспект простоты - краткость. Одна из целей языка Java - обеспечить разработку программ, которые можно было бы совершенно самостоятельно выполнять на небольших машинах. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков (особенно номное микроядро (self-contained microkernel)) занимают еще 17: Кбайт.
Это огромный успех. Заметим, однако, что библиотеки средств поддержки графического пользовательского интерфейса значительно крупнее.

Объектно-ориентированный

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

Объектная ориентация за прошедшие 30 лет уже доказала свою ценность, и без нее невозможно представить себе современный язык программирования. Действительно, объектно-ориентированные особенности языка Java сравнимы с языком C++. Основное различие между ними заключается в механизме множественного наследования, для которого в языке Java найдено лучшее решение, а также в модели метаклассов языка Java.

Механизмы отражения (глава 5) и сериализации объектов (глава 12) позволяют реализовать устойчивые объекты и средства для создания графических пользовательских интерфейсов на основе готовых компонентов.

Если вы никогда не программировали на объектно-ориентированных языках, внимательно изучите главы 4-6. В этих главах излагаются основы объектно-ориентированного программирования и показываются его преимущества при разработке сложных проектов над такими традиционными, процедурно-ориентированными языками, как язык С или Basic.

Распределенный

Java обладает большой библиотекой программ для передачи данных на основе таких протоколов TCP/IP (Transmission Control Protocol/Internet Protocol-протокол управления передачей/Интернет-протокол), как HTTP (Hypertext Transfer Protocol - протокол передачи гипертекстов) или FTP (File Transfer Protocol-протокол передачи файлов). Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью и URL-адресов (Uniform Resource Location - универсальный адрес ресурса) так желегко, как авлокальной сети.

Язык Java предоставляет мощные и удобные средства для работы в сети. Каждый, кто когда-либо пытался писать программы для работы в Интернет на других языках, будет приятно удивлен тем, как легко решаются на языке Java самые трудные задачи, например, открытие сетевых соединений (sockets connection). Элегантный механизм, состоящий из так называемых сервлетов (servlets), делает работу на сервере чрезвычайно эффективной.

Сервлеты поддерживаются многими популярными Web- серверами. (Работа в сети будет описана во втором томе.) Связь между распределенными объектами в языке Java обеспечивается механизмом вызова удаленных методов (эта тема также раскрывается во втором томе).

Надежный

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

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

Если раньше вы программировали на языках Visual Basic или COBOL, в которых указатели явно не используются, возможно, вам непонятно, почему это настолько важно. Программистам на языке С повезло намного меньше. Им нужны указатели для доступа к строкам, массивам, объектам и даже файлам. При программировании на языке Visual Basic ничего этого не требуется, и программист может не беспокоиться о распределении памяти для этих сущностей. С другой стороны, многие структуры данных в языке, не имеющем указателей, реализовать очень трудно. Для обычных структур, вроде строк и массивов, указатели не нужны. Вся мощь указателей проявляется лишь там, где без них нельзя обойтись, например, при создании связанных списков. Программист на языке Java навсегда избавлен от неверных указателей, неправильного распределения и утечки памяти.

Безопасный

Язык Java предназначен для использования в сетевой или распределенной среде. По этой причине большое внимание было уделено безопасности. Язык Java позволяет создавать системы, защищенные от вирусов и постороннего вмешательства.

В первом издании мы написали: "Никогда не говори никогда",- и оказались правы. Группа экспертов по вопросам безопасности из Принстонского университета обнаружила первые ошибки в системе защиты версии Java 1.0 вскоре после появления в продаже первой версии набора инструментальных средств JDK. Более того, и они, и другие специалисты продолжали и впоследствии находить все новые и новые ошибки в механизмах безопасности всех последующих версий языка Java.

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

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

Web-страница компании Sun, посвященная вопросам безопасности, имеет следующий URL-адрес: http://java.sun.com/sfaq/.

Перечислим некоторые ситуации, возникновение которых предотвращает система безопасности языка Java.

1) Переполнение стека выполняемой программы, к которюму приводил печально известный "червь", распространявшийся в Интернет.

2) Повреждение участков памяти, находящихся за пределами пространства, выделенного процессу.

3) Считывание и запись локальных файлов при использовании безопасного загрузчика классов, например Web-броузера, который запрещает такой доступ к файлам.

Все эти меры безопасности вполне уместны и обычно работают безупречно, однако осмотрительность никогда не повредит. Хотя обнаруженные к данному моменту ошибки были далеко не тривиальными, и все детали их поиска часто хранятся в секрете, следует признать, что доказать безопасность языка Java, вероятно, псе же невозможно.

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

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

Не зависящий от архитектуры

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

Это не новая идея. Более 20 лет назад и в системе реализации языка Pascal, разработанной Никлаусом Виртом (Niclaus Wirth), и в системе UCSD Pascal применялась та же самая технология. Использование байт-кодов дает большой выигрыш при выполнении программы (правда, синхронная компиляция во многих случаях его компенсирует). Разработчики языка Java прекрасно справились с разработкой набора команд байт-кода, которые отлично работают на большинстве современных компьютеров, легко транслируясь в реальные машинные команды.

Машинонезависимый

В отличие от языков С и C++, в спецификации Java нет аспектов, зависящих от системы реализации. И размер основных типов данных, и арифметические операции над ними точно определены.

Например, тип int в языке Java всегда означает 32-разрядное целое число. В языках С и C++ тип int может означать как 16-разрядное, так и 32-разрядное целое число, а также целое число произвольного размера, по выбору разработчика конкретного компилятора. Единственное ограничение заключается в том, размер типа int не может быть меньше размера типа short int и больше размера типа long int. Фиксированный размер числовых типов позволяет избежать многих неприятностей, связанных с выполнением программ на разных компьютерах. Бинарные данные хранятся и передаются в фиксированном формате, что также позволяет избежать недоразумений, связанных с разным порядком записи байтов на разных платформах (конфликт "big endian/little endian"). Строки сохраняются в стандартном формате Unicode.

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

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

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

Интерпретируемый

Интерпретатор языка Java может пересылаться на любую машину и выполнять байт-код непосредственно на ней. Поскольку редактирование связей - более легкий процесс, разработка программ может стать намного быстрее и эффективнее.

Возможно, это дает преимущество при разработке приложений, однако приведенная цитата - явное преувеличение. В любом случае компилятор языка Java, входящий в набор инструментальных средств JSDK (Java Software Development Kit), работает довольно медленно. (Некоторые компиляторы, принадлежащие к третьей разновидности, например, компиляторы компании IBM, работают намного быстрее.) Скорость перекомпиляции - это всего лишь один из факторов, характеризующих эффективность среды программирования. Сравнив скорость работы сред программирования на языке Java и языке Visual Basic, вы, возможно, будете разочарованы.

Высокопроизводительный

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

Если для выполнения байт-кодов применяется интерпретатор, не следует употреблять словосочетание "высокая производительность". Однако на многих платформах возможен другой вид компиляции, обеспечиваемый синхронными компиляторами (just-in-time compilers-JIT). Они транслируют байт-код в машинозависимый код, сохраняют результат в памяти, а затем вызывают его при необходимости. Поскольку при этом интерпретация выполняется только один раз, этот подход во много раз увеличивает скорость работы.

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

МНОГОПОТОЧНЫЙ

Обеспечивает лучшую интерактивность и выполнение программы.

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

Динамичный

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

Это очень важно в тех случаях, когда требуется добавить код в уже выполняемую программу. Ярким примером этого является код, который загружается из Интернет для выполнения броузером. В версии Java 1.0 получить информацию о ходе выполняемой программы было совсем не легко, однако нынешняя версия языка Java раскрывает перед программистом как структуру, так и поведение объектов выполняемой программы.
Это весьма ценно для систем, которые должны анализировать объекты в ходе выполнения программы. К таким системам относятся средства создания графического пользовательского интерфейса, интеллектуальные отладчики, сменные компоненты и объектные базы данных.

Язык Java и Интернет

Идея проста- пользователи загружают байт-коды языка Java из Интернет и выполняют их на своих машинах. Программы Java, работающие под управлением Web-броузеров, называются апплетами. Для использования апплета нужен Web-броузер, поддерживающий язык Java и способный интерпретировать байт-коды. Лицензия на исходные коды языка Java принадлежит компании Sun, настаивающей на неизменности как самого языка, так и структуры его основных библиотек. К сожалению, в реальности все не так. Разные версии броузеров Netscape и Internet Explorer поддерживают разные версии языка Java, причем некоторые из этих версий значительно устарели. Эта достойная сожаления ситуация создает все больше препятствий при разработке апплетов, позволяющих использовать преимущества последней версии языка Java. Чтобы решить эту проблему, компания Sun разработала программу Java Plug-in, позволяющую создавать наиболее современную среду для запуска программ на языке Java на основе броузеров Netscape и Internet Explorer.

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

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

На рис. 1.1 показан хороший пример динамической Web-страницы, выполняющей сложные вычисления и применяющей апплет для изображения молекул. Чтобы лучше понять структуру молекулы, можно вращать ее либо изменять масштаб изображения, используя мышь. Такие манипуляции нельзя реализовать на статических Web- страницах, однако апплеты делают это возможным. (Этот апплет можно найти по адресу http: //jmol.sourceforge.net.)

Рис. 1.1. Апплет Jmol

С помощью апплетов на Web-страницу можно добавлять новые кнопки и текстовые поля. Однако такие апплеты медленно загружаются по телефонной линии.

Почти то же самое можно сделать с помощью языка Dynamic HTML, форм языка HTML (Hypertext Markup Language - язык разметки гипертекстов) или языка сценариев, например, языка JavaScript. Разумеется, первые апплеты предназначались для анимации: вращающиеся глобусы, танцующие персонажи мультфильмов, вычурные тексты и т.п. Однако большинство из перечисленного могут делать и анимированные GIF-файлы, а язык Dynamic HTML в сочетании с разработкой сценариев делает намного больше, чем апплеты.

В результате несовместимости броузеров и несогласованности процесса загрузки через медленные сетевые соединения апплеты, предназначенные для Web-страниц, не стали огромным достижением. В локальных сетях (intranets) ситуация совершенно иная. В них обычно не возникают проблемы, связанные с пропускной способностью канала, поэтому время загрузки апплетов несущественно. В локальной сети можно выбирать нужный броузер или применять программу Java Plug-In. Сотрудники не могут переместить программу, доставленную через сеть, в неправильное место или неверно ее установить, а системному администратору не нужно обходить все клиентские машины и обновлять на них программы. Большое количество программ, предназначенных для учета товаров, планирования отпуска, возмещения транспортных расходов и тому подобного, были разработаны многими корпорациями в виде апплетов, использующих броузеры.

Пока мы писали книгу, маятник вновь качнулся от клиентских программ в сторону программирования серверных приложений (server-side programming). В частности, прикладные серверы (application servers) могут использовать мониторинговые возможности виртуальной машины Java для автоматического выравнивания нагрузки, объединения связей с базой данных, синхронизации объектов, безопасного завершения работы и повторной загрузки, а также для выполнения других процессов, необходимых для масштабируемых серверных приложений, которые почти невозможно корректно реализовать. Таким образом, программисты, создающие приложения, получили возможность купить эти сложные механизмы, вместо того, чтобы разрабатывать их самостоятельно. Это повысило производительность труда программистов - они сосредоточились на логике своих программ, не отвлекаясь на детали, связанные с работой серверов.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: