Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью

Государственное образовательное учреждение высшего профессионального образования

ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ

Кафедра “Информационные и вычислительные системы”

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К курсовому проекту

По дисциплине “Методы программирования”

На тему: “Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью “

Выполнил:

Студент группы КИБ-708

Таранин В. В.

Руководитель:

К. т.н., доц. Кожомбердиева Г. И.

Санкт-Петербург 2009

Задание

По курсовому проекту

По дисциплине “Методы программирования”

На тему: “Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью”

– В качестве исходных данных к курсовому проекту используется апплет, являющийся результатом выполнения лабораторной работы №4 “Разработка апплета с эффектом анимации на основе многопоточности Java” .

Вариант задания №20

– Необходимо расширить функциональность апплета с эффектом анимации, реализовав обращение к локальной файловой системе.

– Создать архивный JAR-файл, содержащий апплет.

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

При выполнении курсового проекта использовать утилиты jar, keytool и jarsigner, а также комплект JDK 1.4.x с модулем plug-in для браузера MS IE 5,(6),(7).

Аннотация

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

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

Подписанный электронной цифровой подписью апплет выполняется в среде MS IE с модулем plug-in из JDK 1.4.x.

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

Содержание

Введение

1. Апплет с эффектом анимации на основе многопоточности Javaи обращением к локальной файловой системе

2. Создание подписанного апплета

2.1 Создание архивного JAR-файла

2.2 Создание пары ключей и сертификата в хранилище ключей

2.3 Подписывание JAR-файла цифровой подписью

2.4 Задание политики безопасности для подписанного апплета

3. Выполнение подписанного апплета

Список использованных источников

Введение

Платформа Java 2 располагает мощной встроенной системой безопасности, включающая API-интерфейсы и механизмы, которые используются для обеспечения безопасности апплетов и приложений Java. Среди особенностей языка программирования Java, которые обеспечивают надежность и безопасность можно выделить: архитектурную независимость, интерпретируемость, переносимость, отсутствие указателей, строгую типизацию, эффективный механизм обработки исключений. Важными неотъемлимыми компонентами системы безопасности Java 2 являются Java Cryptography Architecture (JCA) – архитектура шифрования Java, а также Java Cryptography Extension (JCE) – криптографическое расширение Java.

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

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

1. Апплет с эффектом анимации на основе многопоточности Java и

Обращением к локальной файловой системе

Апплет архивный электронный цифровой подпись

Importjava. applet. Applet;

Import java. awt.*;

Import java. awt. event.*;

Import java. io.*;

Importjava. util. Calendar;

// Класс апплета, реализующий интерфейсы блоков прослушивания событий

Public class Lab4 extends Applet implements ActionListener, ItemListener, Runnable

{

Panel p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,cards, pfield, pb, pread;

Label lb1,lb2,lb3;

CheckboxGroup cbg;

Checkbox cb1,cb2,cb3,cb4;

List list;

Canvas cv;

Button b1,b2,b3,b4,start, stop, read;

CardLayout cardLO;

Scrollbar sb1,sb2,sb3,sb4;

Color col;

Int posX, strWidth;

FontMetrics fm;

Int rectX=0,rectY=0,posFlag=0,movFlag=0,ovalX=0,ovalY=0;

Int animFlag=0;

Int rColor, gColor, bColor;

// Флаг остановки анимации

BooleanstopFlag;

// Поток выполняющий анимацию

Threadt = null;

//Текстовая область для вывода содержимого файла журнала

TextAreafileText;

// Имя файла-журнала для записи информации о работе апплета

StringfileName = “”;

// Разделитель строк (признак конца строки)

Stringls;

// Буферизированный символьный поток записи в файл

BufferedWriter out;

Public void init()

{

SetLayout(new GridLayout(2,2));

SetForeground(Color. black);

Col = Color. black;

// ЛЕВАЯ ВЕРХНЯЯ ПАНЕЛЬ

P1 = new Panel(new BorderLayout());

P1.setBackground(Color. lightGray);

P2= new Panel();

Lb1 = new Label(“Активная панель: “,lb1.CENTER);

P2.add(lb1);

P1.add(p2,BorderLayout. NORTH);

// Панель радиокнопок внутри ЛЕВОЙ ВЕРХНЕЙ панели

P3 = new Panel(new GridLayout(2,2));

Cbg = new CheckboxGroup();

Cb1= new Checkbox(“Все панели”,cbg, true);

Cb2= new Checkbox(“1-я панель”,cbg, false);

Cb3= new Checkbox(“2-я панель”,cbg, false);

Cb4= new Checkbox(“3-я панель”,cbg, false);

Cb1.addItemListener(this);

Cb2.addItemListener(this);

Cb3.addItemListener(this);

Cb4.addItemListener(this);

P3.add(cb1);

P3.add(cb2);

P3.add(cb3);

P3.add(cb4);

P1.add(p3,BorderLayout. CENTER);

Add(p1);

// ВЕРХНЯЯ ПРАВАЯ ПАНЕЛЬ

P4 = new Panel(new GridLayout(1,1));

List = new List(9,false);

List. add(“Черный”);

List. add(“Синий”);

List. add(“Красный”);

List. add(“Зеленый”);

List. add(“Желтый”);

List. add(“Оранжевый”);

List. add(“Розовый”);

List. add(“Фиолетовый”);

List. add(“Темно-серый”);

List. addItemListener(this);

P4.add(list);

Add(p4);

// ЛЕВАЯ НИЖНЯЯ ПАНЕЛЬ

// Панель с кнопками

P5 = new Panel(new GridLayout(2,2));

B1 = new Button(“Квадрат”);

B2 = new Button(“Круг”);

B3 = new Button(“Треугольник”);

B4 = new Button(“Строка”);

B1.addActionListener(this);

B2.addActionListener(this);

B3.addActionListener(this);

B4.addActionListener(this);

P5.add(b1);

P7.add(b2);

P5.add(b3);

P5.add(b4);

Pb = new Panel(new GridLayout(1,2,5,0));

Lb2 = newLabel(“Управление потоками”,lb1.CENTER);

Start = new Button(“Запуск”); start. addActionListener(this);

Stop = new Button(“Остановка”);stop. addActionListener(this);

Pb. add(start);

Pb. add(stop);

// !!! ПАНЕЛЬ ДЛЯ ЧТЕНИЯ ФАЙЛА-ЖУРНАЛА!!!

Pfield = new Panel(new BorderLayout());

Pread = new Panel(new GridLayout(3,1));

Read = new Button(“Чтение файла-журнала”);

Read. addActionListener(this);

// Текстовая область для вывода информации из файла журнала

FileText = newTextArea();

// Название файла-журнала задается параметром в HTML-файле

// или если такого нет – создается по умолчанию

FileName = getParameter(“FileName”);

If (fileName == null)

FileName = “log. txt”;

Ls = System. getProperty(“line. separator”); // разделитель строк

FileText. setBackground(Color. white);

Pread. add(lb2);

Pread. add(pb);

Pread. add(read);

Pfield. add(p5,BorderLayout. NORTH);

Pfield. add(pread, BorderLayout. CENTER);

Pfield. add(fileText, BorderLayout. SOUTH);

Add(pfield);

// ПРАВАЯ НИЖНЯЯ ПАНЕЛЬ

// ПАНЕЛЬ С КАРТАМИ (ГЛАВНАЯ)

CardLO = new CardLayout();

Cards = new Panel();

Cards. setLayout(cardLO);

Cards. setBackground(Color. white);

PosX = 65;

// ПЕРВАЯ ПАНЕЛЬ В КАРТАХ

P6 = new Panel(new BorderLayout())

{

Public void paint(Graphics g)

{

If(animFlag==0)

{

G. setColor(col);

G. drawRect(rectX, rectY,50,50); }

}

};

// ВТОРАЯ ПАНЕЛЬ В КАРТАХ

P7 = new Panel(new BorderLayout())

{

Public void paint(Graphics g)

{

If(animFlag==1)

{

G. setColor(col);

G. fillOval(ovalX, ovalY,50,50); }

}

};

// ТРЕТЬЯ ПАНЕЛЬ В КАРТАХ

P8 = new Panel(new BorderLayout())

{

Public void paint(Graphics g)

{

G. setColor(col);

Int x[] = {posX, posX+40,posX+80};

Int y[] = {80,20,80};

G. drawPolygon(x, y,3);

}

};

Sb3= new Scrollbar(Scrollbar. HORIZONTAL,0,1,0,100);

Sb3.addAdjustmentListener(new AdjustmentListener()

{

Public void adjustmentValueChanged(AdjustmentEvent ae)

{

PosX = (ae. getValue())*(cards. getSize().width -80) /sb3.getMaximum();

P8.repaint();

}

});

P8.add(sb3,BorderLayout. SOUTH);

// ЧЕТВЕРТАЯ ПАНЕЛЬ В КАРТАХ

P9 = new Panel(new BorderLayout())

{

Public void paint(Graphics g)

{

Fm = g. getFontMetrics();

StrWidth = fm. stringWidth(“J A V A”);

G. setFont(new Font(“Dialog”,Font. ITALIC,20));

G. setColor(col);

G. drawString(“J A V A”,posX,65);

}

};

Sb4= new Scrollbar(Scrollbar. HORIZONTAL,0,1,0,5);

Sb4.addAdjustmentListener(new AdjustmentListener()

{

Public void adjustmentValueChanged(AdjustmentEvent ae)

{

PosX = (ae. getValue())*(cards. getSize().width – strWidth)/sb4.getMaximum();

P9.repaint();

}

});

P9.add(sb4,BorderLayout. SOUTH);

// ДОБАВЛЕНИЕ КАРТ В ПАНЕЛЬ С КАРТАМИ (cards)

Cards. add(p6,”sqaure”);

Cards. add(p7,”oval”);

Cards. add(p8,”rect”);

Cards. add(p9,”text”);

Add(cards);

// СОЗДАНИЕ БУФЕРИЗИРОВАННОГО СИМВОЛЬНОГО ПОТОКА ЗАПИСИ В ФАЙЛ

Try

{

// В качестве параметра в данном конструкторе класса Buffered используется

// ссылка на объект основного потока (приемника данных)

Out = new BufferedWriter(new FileWriter(fileName));

}

Catch(IOException ex)

{

FileText. setText(“Ошибка при создании потока записи: ” + ls);

FileText. append(ex. toString() + ls);

}

Catch(SecurityException ex)

{

FileText. setText(“Нет разрешения доступа к файлу: ” + ls);

FileText. append(ex. toString() + ls);

Read. setEnabled(false);

}

If (out!= null)

{

// Если создание Buffered-потока прошло успешно то в качестве данных, которые

// будут заполнять буфер будет являться сообщение от текущей дате и времени

Calendar c = Calendar. getInstance();

String dateMessage =”Дата и время: ” + c. get(Calendar. DAY_OF_MONTH) + “/” +

(c. get(Calendar. MONTH)+1) + ” – ” + c. get(Calendar. YEAR) +

” ” + c. get(Calendar. HOUR_OF_DAY) + “:” +

C. get(Calendar. MINUTE);

// После записи в String-переменную dateMessage информации о дате –

// вызывается метод writeLogMessage

WriteLogMessage(dateMessage);

WriteLogMessage(“Инициализация апплета завершена”);

}

/*————–INIT————–*/

}

// Вывод сообщения в буферизированный поток для записи в файл

PrivatevoidwriteLogMessage(Stringmessage)

{

// Запись в файл осуществляется вызовом метода write объек-та out типа BufferedWriter

Try

{

Out. write(message);

Out. newLine();

}

Catch(IOException ex)

{

FileText. setText(“Ошибка записи в файл:” + ls);

FileText. append(ex. toString() + ls);

}

}

// Запускпотоков

Public void run()

{

// Пока флаг остановки анимации равен false – происходит анимация

While (!stopFlag)

{

Try

{

If(animFlag==0)

{

If(posFlag==0) // Начальное движение вправо по верхней грани

{

P6.repaint(); // Перерисовка

// Временное (на 40 мс) остановка потока для создания эффекта анимации

// Далее идут аналогичные изменения координат/

Thread. currentThread().sleep(40);

RectX+=5;

If(rectX>p6.getSize().width-50)

{

RectX-=7;

PosFlag =1;

If(posFlag==1)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P6.repaint();

}

}

}

If(posFlag==1) // Движение вниз по правой грани

{

P6.repaint();

Thread. currentThread().sleep(40); // приостановить поток

RectY+=5;

If(rectY>p6.getSize().height – 50)

{

RectY=p6.getSize().height-53;

PosFlag=2;

If(posFlag==2)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P6.repaint();

}

}

}

If(posFlag==2) // Движение влево по нижней грани

{

If(rectX>0)

{

P6.repaint();

Thread. currentThread().sleep(40);

RectX-=5;

}

Else

{

RectX=0;

PosFlag=3;

If(posFlag==3)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P6.repaint();

}

}

}

If(posFlag==3) // Движение вверх по левой грани

{

If(rectY>0)

{

P6.repaint();

Thread. currentThread().sleep(40);

RectY-=5;

If(rectY<0)

{

RectX=0;

RectY=0;

P6.repaint();

{

If(rectX==0 &;&; rectY==0)

{

PosFlag=0;

If(posFlag==0)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P6.repaint();

}

}

}

}

}

}

}

If(animFlag==1)

{

If(movFlag==0) // Движение по диагонали сверху в нижний угол

{

P7.repaint();

Thread. currentThread().sleep(50);

OvalX+=5;

OvalY+=5;

If(ovalX>p7.getSize().width-50)

{

OvalX = p7.getSize().width -50;

OvalY = p7.getSize().height-52;

MovFlag =1;

If(movFlag==1)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P7.repaint();

}

}

}

If(movFlag==1) // Движение по нижней грани

{

P7.repaint();

Thread. currentThread().sleep(50);

OvalX-=5;

If(ovalX<0)

{

OvalX=0;

MovFlag=2;

If(movFlag==2)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P7.repaint();

}

}

}

If(movFlag==2) // Движение по диагонали снизу вверх

{

P7.repaint();

Thread. currentThread().sleep(50);

OvalX+=5;

OvalY-=5;

If(ovalX>p7.getSize().width-50)

{

OvalX = p10.getSize().width – 52;

OvalY = 0;

MovFlag=3;

If(movFlag==3)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P7.repaint();

}

}

}

If(movFlag==3) // Движение по верхней грани в обратном направлении

{

P7.repaint();

Thread. currentThread().sleep(50);

OvalX-=5;

If(ovalX<0)

{

OvalX = 0;

MovFlag=0;

If(movFlag==0)

{

RColor = (int)(255*Math. random());

GColor = (int)(255*Math. random());

BColor = (int)(255*Math. random());

Col = new Color(rColor, gColor, bColor);

P7.repaint();

}

}

}

}

}

Catch (InterruptedException e)

{

Return; // Завершить поток

}

}

}

//Реализация блоков прослушивания от кнопок

PublicvoidactionPerformed(ActionEvente)

{

String ac = e. getActionCommand();

If(ac. equals(“Квадрат”))

{

AnimFlag=0;

CardLO. show(cards,”sqaure”);

WriteLogMessage(“Рисуется Квадрат”);

}

If(ac. equals(“Круг”))

{

AnimFlag=1;

CardLO. show(cards,”oval”);

WriteLogMessage(“Рисуется Круг”);

}

If(ac. equals(“Треугольник”))

{

CardLO. show(cards,”rect”);

}

If(ac. equals(“Строка”))

{

CardLO. show(cards,”text”);

}

Else if(“Запуск”.equals(ac))

{

T = new Thread(this);

StopFlag = false;

T. start();

Start. setEnabled(false);

WriteLogMessage(“Поток запущен”);

}

Else if(“Остановка”.equals(ac))

{

StopFlag=true;

T = null;

Start. setEnabled(true);

WriteLogMessage(“Поток остановлен”);

}

If(“Чтение файла-журнала”.equals(ac))

{

Try

{

// Сброс данных из буфера потока (запись в файл)

Out. flush();

// Далее происходит чтение из файла и заполнение текстовой области

// данными, содержащимися в текстовом файле Lab4Log. txt

// Создание буферизированного символьного потока чтения из файла*/

BufferedReader in = new BufferedReader(new FileReader(fileName));

String s = “”, line;

While ((line = in. readLine()) != null)

S += line + “\n”;

FileText. setText(s);

In. close();

}

Catch(IOException ex)

{

FileText. setText(“Ошибка чтения файла: ” + ls);

FileText. append(ex. toString());

}

}

}

// Реализация блока прослушивания от списка Listи переключателей(CheckBox)

Public void itemStateChanged(ItemEvent ie)

{

If(ie. getSource() == list)

{

String s = list. getSelectedItem();

If(s. equals(“Черный”))

{

Col = Color. black;

}

If(s. equals(“Синий”))

{

Col = Color. blue;

}

If(s. equals(“Красный”))

{

Col = Color. red;

}

If(s. equals(“Зеленый”))

{

Col = Color. green;

}

If(s. equals(“Желтый”))

{

Col = Color. yellow;

}

If(s. equals(“Оранжевый”))

{

Col = Color. orange;

}

If(s. equals(“Розовый”))

{

Col = Color. pink;

}

If(s. equals(“Фиолетовый”))

{

Col = Color. magenta;

}

If(s. equals(“Темно-серый”))

{

Col = Color. darkGray;

}

P6.repaint();

P7.repaint();

P8.repaint();

P9.repaint();

}

}

// Обработка события от CheckBox(Определение доступности панелей и их компонентов)

If(ie. getSource() == cb1)

{

P1.setEnabled(true);p4.setEnabled(true);

P7.setEnabled(true);

Cards. setEnabled(true);

}

If(ie. getSource() == cb2)

{

P1.setEnabled(true);p4.setEnabled(true);

P7.setEnabled(false);

Cards. setEnabled(false);

}

If(ie. getSource() == cb3)

{

P1.setEnabled(true);p4.setEnabled(false);

P7.setEnabled(true);

Cards. setEnabled(false);

}

If(ie. getSource() == cb4)

{

P1.setEnabled(true);p4.setEnabled(false);

P7.setEnabled(false);

Cards. setEnabled(true);

}

}

}

2. Создание подписанного апплета

2.1 Создание архивного JAR – файла

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

Для создания архива применилась команда следующего вида:

Jar cfv Lab4.jar Lab4*.class,

Где: jar – название утилиты, которая упаковывает файлы и создает архив

Cfv – это набор из трех параметров:

– с – указывает на то, что создается новый архив

– f – первый элемент в списке файлов – имя архива, который должен быть создан

– v – вывод на консоль сообщений о всех действиях утилиты jar

Lab 4. jar – название нового архива

Lab 4*. class – параметр указывает, что все файлы классов расположенные в текущем каталоге, размещаются в архивеLab 4. jar

При этом утилита jar создает каталогMETA – INF с файлом описания архиваMANIFEST. MF

Также в HTML файле, используемом для запуска апплета были внесены изменения, а именно добавлен атрибут ARCHIVE элемента Applet. Значение атрибута ARCHIVE = Lab 4. JAR.

2.2 Создание пары ключей и сертификата в хранилище ключей

Далее с помощью утилиты keytool создается пара ключей (“открытый/закрытый”) и сертификат по стандарту X.509 для псевдонима ” Taraninkey ” в хранилище ключейTaranin store в текущем каталоге.

Для создания самоподписанного сертификата применилась команда:

Keytool – genkey – alias “Taraninkey” – keystore Taraninstore,

Где:

– genkey – параметр указывающий, что утилита keytool должна сгенерировать ключи

-alias ” Taraninkey ” – псевдоним, под которым в хранилище ключей размещается сертификат

– keystore Taraninstore – название хранилища ключей

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

В данном курсовом проекте пароль закрытого ключа “Taraninkey ” – 123369, а пароль хранилища ключей “Taraninstore ” – 123.

При создании ключей и подписании сертификата были использованы алгоритмы:

– Алгоритм ключа RSA

– Алгоритм подписи MD-5

2.3 Подписывание JAR – файла цифровой подписью

Архивный JAR-файл подписывается с помощью утилиты jarsigner. используя следующую команду:

Jarsigner – keystore Taraninstore Lab 4. jar ” Taraninkey “

Утилита требует ввести пароль хранилища ключей и пароль закрытого ключа после чего модифицирует файл описания архива MANIFEST. MF в каталоге META-INF архива.

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

Также в каталог META-INF архива добавляется файл подписиTARNINK. SF.

Содержимое файла подписи TARNINK. SF.

Файл подписи идентифицирует каждый из файлов в архиве, алгоритм дайджестасодержит для каждого файла значение дайджеста, вычисленного из записи файла в файле описания MANIFEST. M F.

На заключительном этапе подписания в каталог META-INF файла архива добавляется двоичный файл подписиTARANINK. R SA. Расширение файла подписи указывает, что утилита keytool использует алгоритм цифровой подписиRSA. Этот файл содержит подпись файла подписиTARNINK. SF и сертификат, заверяющий подлинность открытого ключа, соответствующего закрытому ключу, использованному при создании подписи.

2.4 Задание политики безопасности для подписанного апплета

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

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

3. Выполнение подписанного апплета

При запуске апплета в среде браузера MS IE 5(6) с модулем Javaplgu-in из JDK 1.4.x система безопасности задает вопрос о доверии поставщику, чьим сертификатом заеверен апплет.

При выборе пользователем ответаGrant this session апплет получает полные права доступа ко всем ресурсам. Для обращения к локальной файловой системе пользователь может осущесвить чтение файла-журнала, хранящегося на локальном диске, нажав кнопку ” View Certificate “.

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

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

Список использованных источников

1. Корниенко А. А., Кожомбердиева Г. И., Ерофеев П. В. Электронная цифровая подпись и безопасность Java-апплетов. Метод. указания. – СПб.: ПГУПС, 2005. – 28 с.

2. Корниенко А. А., Кожомбердиева Г. И., Киселев И. С. Методы криптографической защиты информации и их реализация на платформе Java: Метод. указания. – СПб.: ПГУПС, 2006. – 35 с

3. Ноутон П., Шилдт Г. Java 2: Пер. с англ. – СПб.: БХВ-Петербург, 2006

4. Java 2 SDK, Standard Edition Documentation, version 1.2.2.

5. Яворски Дж., Перроун П. Система безопасности Java, 2001.


Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью