PОЗДІЛ 2 ВИБІР ЗАСОБУ ДЛЯ РОЗРОБКИ МЕТОДІВ ШИФРУВАННЯ
Переваги мови Java, як засобу створення методів шифрування
Для розробки нового методу шифрування було обрано мову програмування Java. Ось десять причин, чому Java найкраще підходить для цього завдання.
1. Безпечність
Один із ключових принципів розробки мови Java полягав у забезпеченні захисту від несанкціонованого доступу. Програми на Java не можуть викликати глобальні функції й одержувати доступ до довільних системних ресурсів, що забезпечує в Java рівень безпеки, недоступний для інших мов. Даний рівень безпеки виконання Java-програм забезпечує віртуальна машина Java, котра вбудована в операційну систему. Об'єктна модель у Java проста і легко розширюється, у той же час, заради підвищення продуктивності прості типи даних Java не є об'єктами.
WorldWideWeb висунула Java на передній план програмування, і Java, в свою чергу, сильно вплинула і навіть змінила обличчя Internet, розширивши спектр об’єктів, які можуть розповсюджуватись у кіберпросторі. Програми нової форми - аплети - завантажуються з віддаленого сервера і можуть запускатися динамічно, тобто без участі користувача. До появи Java такий підхід був неприпустимий з міркувань безпеки та переносимості. В архітектурі аплетів зроблено ряд штучних обмежень, які роблять їх цілком безпечними. Перш за все, Java є інтерпретованою мовою і простір ресурсів Java-програми обмежений так званою віртуальною Java-машиною (VJM), яка може конторолювати поведінку програми і захищати систему від побічних ефектів, які можуть виникати з вини аплета. Крім того, в мові Java є додаткові обмеження, які не дозволять аплету стати «троянським конем». Зокрема, Java-аплет не може отримати доступ до локального жорсткого диску. При такій спробі генерується виключна ситуація.
Ефективність
Оскільки аплети Java інтерпретуються, а не компілюються, то їх виконання на різних платформах значно полегшується. В цьому випадку достатньо створити для кожної платформи виконуючу Java-систему. Якщо існує така система для даної операційної системи, то будь-яка Java-програма може виконуватись в даному середовищі без додаткової компіляції на цій платформі. Проте Java не є інтерпретованою мовою в чистому розумінні. Програма на Java компілюється. Результатом роботи компілятора Java є байткод (bytecode). Байткод - це оптимізований набір команд, призначений для виконання уявним пристроєм - віртуальною Java-машиною. В такий спосіб витрати на інтерпретацію зводяться до мінімуму, оскільки байкод вже є оптимізованим, і досягається досить висока продуктивність Java-програм. Наведені вище особливості дають підставу розглядати Java не як ще одну мову програмування, а як окрему інформаційну технологію. Таким чином, інтерпретація - це найлегший шлях до перенесення програм, реалізований в Java технології. Незважаючи на те, що мова Java була розроблена в розрахунку на інтерпретацію, технічно немає нічого такого, що б перешкоджало компіляції байткоду в виконуваний код. До байткоду, який пересилається по мережі, застосовується динамічна компіляція, але це ніяк не впливає на переносимість та безпеку, оскільки роботу програми все ще контролює виконуюча система. Такий підхід застосовано в багатьох виконуючих системах Java, що забезпечує продуктивність на рівні оптимізованого коду С++.
Мова Java є однією з наймолодших в сімействі мов програмуваня і була розроблена з розрахунку на те, щоб професійний програміст міг легко її опанувати та ефективно використовувати. За основу Java взятий синтаксис С++ - безсумнівно однієї з найбільш популярних мов програмування сучасності. Проте, Java - це цілком самостійна мова програмування, і при її створенні не йшлося про будь-яку сумісність з С++. Тому деякі механізми реалізовані в Java інакше, а деякі зовсім відсутні. Ідеологічно ж Java побудована дещо інакше ніж С++. Розробники Java грунтувалися на досвіді розробки програм на С++ і прагнули позбутися можливостей, які зарекомендували себе непевними. Так, в Java відсутня перегрузка операторів а також автоматичне приведення несумісних типів - конструкції, які при неуважному використанні є джерелом важких для виявлення помилок. Взагалі, інтерфейси Java більш прості та прозорі для розуміння. Написати на Java програму з графічним інтерфейсом значно легше. Звичайно, простота інтерфейсів компенсується меншою гнучкістю, бібліотека Java не така багата, як стандартні бібліотеки С/С++. Але згадаймо, що Java задуманий для використання на різних платформах і тому реалізує в собі найбільш стандартні можливості задля легшої адаптації під конкретне середовище.
3. Об’єктно-орієнтована спрямованість
Від С++ Java успадкувала потужний механізм об’єктно-орієнтованого програмування. Оскільки Java розроблювався «на пустому місці», тобто не було потреби забезпечувати сумісність з попередніми версіями, розробники мали повну свободу мислення. В результаті був сформований ясний і прагматичний підхід до об’єктів. Вільно переймаючи ідеї, які реалізовувалися протягом останніх десятирічь, мові Java вдалося знайти рівновагу між парадигмою «все є об’єктом» і прагматичним підходом. Об’єктна модель Java проста і легко розширюється, в той час як просі типи, як цілі, зберігаються як дані, що не є об’єктами, що дозволяє значно підвищити швидкість при їх обробці.
В Java вбудований набір ключових класів, що містять основні абстракції реального світу, з яким прийдеться мати справа вашим програмам. Основою популярності Java є вбудовані класи-абстракції, що зробили його мовою, дійсно незалежним від платформи.
Фактично, більшість архітектурних рішень, прийнятих при створенні Java, було продиктовано бажанням надати синтаксис, подібний із С и C++. У Java використовуються практично ідентичні вимоги для оголошення змінних, передачі параметрів, операторів і для керування потоком виконанням коду. У Java додані всі гарні риси C++, але виключені недоліки останнього.
Вказівники або адреси в пам'яті — найбільш могутня і найбільш небезпечна риса C++. Причиною більшості помилок у сьогоднішньому коді є саме неправильна робота з вказівники. Наприклад, одна з типових помилок — прорахуватися на одиницю в розмірі масиву і зіпсувати вміст комірки пам'яті, розташованої слідом за ним.
Хоча в Java дескриптори об'єктів і реалізовані у вигляді вказівників, у ній відсутні можливості працювати безпосередньо з ними. Ви не можете перетворити ціле число в вказівник, а також звернутися до довільної адреси пам'яті.
Проте на мові Java можна створювати не тільки апплети, а й консольні додатки, GUI-додатки, сервлети та JSP. Невдовзі після появи технології сервлетів розробники стикнулися з такою проблемою: для динамічної генерації HTML-сторінок за допомогою сервлета HTML-код доводиться розміщувати в самому сервлеті. При цьому HTML-код сторінки змішується з Java-кодом (при цьому логіка роботи програми змішується із зовнішнім виглядом web-сторінки), що ускладнює роботу як програміста, так і веб-дизайнера.
Для вирішення цієї проблеми була розроблена технологія JavaServerPages (JSP). Вона дозволяє розміщувати Java-код всередині HTML-коду web-сторінки. При першому зверненні до jsp-сторінки її код автоматично перетворюється в сервлет і компілюється. Після цього при наступних зверненнях web-сервер викликає не jsp-сторінку, а відкомпільований сервлет. При внесенні змін в jsp-сторінку web-сервер виявляє, що сторінка змінилась, і знову оновлює відповідний сервлет.
У технологіях сервлетів і JSP введене поняття контейнера (container). Servlets-контейнер – це механізм, що відповідає за виконання сервлетів. JSP-контейнер – механізм, що відповідає за перетворення jsp-сторінок у сервлети і передачу цих сервлетів Servlets-контейнеру. Оскільки сервлети і jsp-сторінки викликаються через протокол HTTP, то контейнери часто супроводжує ще один компонент – web-сервер. Сукупність web-серверу і контейнерів формує web-сервер додатків.
Технологія Servlets і JSP були об’єднані з декількома іншими Java-технологіями, і цей комплекс був названий Java 2 EnterpriseEdition (J2EE). Таким чином з’явилися сервери Java-додатків від різних компаній (IBM, BEA, IONA, Borland), у тому числі від самої компанії Sun. Кожна компанія у своєму сервері додатків реалізує технології J2EE по-своєму, але всі вони відповідають специфікації Sun.
Компанія Sun раніше пропонувала безкоштовну еталонну реалізацію Javaweb-сервера додатків під назвою JServ. Після виходу технології J2EE весь код був переданий компанії ApacheSoftwareFoundation, а продукт змінив свою назву на Tomcat.
На даний момент Tomcat є еталонною реалізацією Javaweb-сервера і входить в групу проектів Apache під назвою Jakarta.
4. Стійкість до помилок.
Багатоплатформність середовища Web висуває надзвичайно високі вимоги до надійності програм. Як наслідок, при розробці Java приорітет був відданий можливості створення стійких до помилок програм. Java звільняє програміста від хвилювань з приводу багатьох поширених причин, які викликають помилки програмування. Як вже згадувалося, Java є строго типізованою мовою програмування. Ще виконуюча система Java бере на себе «прибирання сміття», тобто автоматично звільняє пам’ять, яка була розподілена динамічно. Звичайно, це дещо знижує ефективність коду, але запобігає типовим помилкам, коли програміст забуває звільнити виділену пам’ять, або, навпаки, звільняє пам’ять, яка ще використовується. Java підтримує об’єктно-орієнтовану обробку виключних ситуацій подібно до С++. Але на відміну від С++ в Java обробка виключних ситуацій є обов’язкувою. Тобто неможливо скомпілювати програму, яка відкриває файл, не обробивши можливі помилки типу «файл не знайдено», які виникають при цьому. Добре написана Java-програма може сама обробляти всі помилки часу виконання.
5. Підтримка багатозадачності.
Java розробляялася з орієнтацією на вимоги до створення інтерактивних програм, які працюють з мережею. З цією метою Java підтримує багатозадачність програмування, яке дозволяє легко розробляти програми, що викинують багато процесів одночасно. Виконання Java-програми засновано на елегантному, але в той самий час високоорганізованому рішенні багатопроцесової синхронізації, яке дозволяє вам створювати високоефективні інтерактивні системи.
У Java реалізовано кілька цікавих рішень, що дозволяють писати код, що виконує одночасно масу різних функцій і не забуває при цьому стежити за тим, що і коли повинно відбутися. У мові Java для рішення проблеми синхронізації процесів застосований найбільш елегантний із усіх коли-небудь, винайдених методів, що дозволяє конструювати прекрасні інтерактивні системи. Прості в звертанні витончені підпроцеси Java дають можливість реалізації в програмі конкретної поведінки, не відволікаючись при цьому на побудову глобальної циклічної обробки подій.
6. Незалежність від архітектури.
Основним питанням для розробників Java стало питання довготривалості та переносимості. Одна з головних проблем, із якою зустрілися програмісти, полягала в відсутності гарантій того, що написана сьогодні програма завтра працюватиме з тим же успіхом, причому на тій самій машині. Оновлення операційної системи, модернізація процесора та зміна об’єму оперативної пам’яті можуть призвести до збою програми. Розробники Java, прагнули змінити цю ситуацію і прийняли декілька важких рішень відносно мови Java та процесу виконання Java-програми. Їх мета полягала в тому, щоб «одного разу написане працювало всюди, в любий час і завжди». Внаслідок цього Java є системою, яка легко розширюється за рахунок створення нових стандартних класів та бібліотек.
7. Переваги інтерпретованості в поєднанні з високою продуктивністю.
Як вже згадувалось, Java дозвляє створювати незалежні від платформи програми шляхом компіляції в проміжне представлення, яке називається байткодом. Багато попередніх спроб знайти розв’язок проблеми незалежності від платформи були зроблені за рахунок продуктивності. Інтерпретуючі системи, подібні до BASIC, Perl, страждають на майже неподоланний дефіцит продуктивності. Це було враховано при створенні Java. Незважаючи на те, що Java є інтерпретованою мовою, генерація байткодів була ретельно оптимізована в такий спосіб, щоб одержуваний байткод можна було легко перекладати в машинний код, який працює з дуже високою продуктивністю. Виконуючі системи такого роду не втрачають жодних переваг переносимого коду.
8. Розподіленість.
Мова Java призначена для створення програм, які працюють в розподіленому середовищі Internet на базі протоколів TCP/IP. Насправді доступ до ресурсів за допомогою URL відрізняється від доступу до файлу. Крім того в Java наявний засіб передачі повідомлень в межах внутрішнього адресного простору. Це дозволяє забеспечити віддалене виконання процедур. Ці інтерфейси включені у пакет RMI (remotemetodinvocation). Цей засіб привносить високий рівень абстракції в програмування дл я середовища клієнт/сервер.
Java-програми несуть у собі значний обсяг інформації про типи часу виконання (run-timetypeinformation), яка використовується для дозволу доступу до об’єктів під час роботи програми. Це дозволяє забезпечити безпечну та оптимальну динамічну компоновку. В такий спосіб досягається захищеність середовища виконання аплетів.
9. Доступність інструментарію та ефективність розробок.
Зазначена вище простота програмування на Java є причиною того, що розробки на Java коштуватимуть дешевше аналогічних на більш потужніх мовах програмування. Цьому ж сприяє і переносимість програм на Java, оскільки ліквідуються витрати пов’язані з адаптацією програми на конкретній платформі. До того ж інтегровані програми-оболонки для розробки Java програм коштують набагато дешевше ( 70-100$ ) ніж аналогічні продукти C++, Delphi ( ~1000$). А набір інструментарію для пакетної компіляції Java програм JDK (JavaDevelopmentKit) є взагалі freeware. Тому платформу Java можна рекомендувати як ідеальну для створення некомерційних програмних продуктів, зокрема для галузі освіти.
10. Перспективи застосування.
Програми на Java можуть знайти різне застосування в навчальному процесі: інтерактивні навчаючі програми (HTML в поєднанні з Java), програми-тести і особливо ділові ігри. Додаткові переваги можна отримати, якщо пистати ці програми у вигляді аплетів, які ініціалізуються з Web сервера внутрішньої мережі Intranet. В такий спосіб можна уникнути інсталяції програми на багатьох комп’ютерах - користувач просто запускає Web-браузер і завантажує потрібну сторінку. Для тестових програм, написаних на Java з викориситанням архітектури клієнт/сервер можна підвищити ступінь конфіденційності. База даних тестових запитань знаходиться на сервері в каталозі з обмеженим доступом. Коли користувач завантажує аплет, він автоматично підключається до програми-сервера, яка виконується на сервері і може видавати запитання з бази даних у відповідь на запит користувача. В такий спосіб унеможливлюється викрадення бази даних, за умови відсутності фізичного доступу до серверу у користувачів.
Окреме питання - навчальні ділові ігри. Під такою грою розумітимемо гру, за участю кількох користувачів, в якій мається на увазі динамічний обмін інформацією між ними. Система безпеки Java накладає обмеження, внаслідок якого аплет може встановлювати з’єднання лише з хостом, з якого він був загружений і ні з яким більше. Але це обмеження легко обходиться: на сервері виконується програма-сервер, з якою з’єднуються усі клієнти і через яку здійснюється обмін інформацією. Таким чином така програма повинна мати архітектуру клієнт/сервер.